首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

采取ThreadLocal维护Connection

2013-03-13 
采用ThreadLocal维护Connection在做考试系统的时候,当使用到事务的时候,为保证各个方法都是使用同一个连接

采用ThreadLocal维护Connection

在做考试系统的时候,当使用到事务的时候,为保证各个方法都是使用同一个连接,我们需要把连接传来传去的。

这里,我们采用ThreadLocal维护Connection可以避免这种情况。

 

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。

该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 getset 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。

ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联,即在同一个线程,可以共享该资源。

 

采用ThreadLocal维护Connection实例

package com.jialin.drp.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/** * 采用ThreadLocal维护Connection * @author jialin * */public class ConnectionManage {//用于保存connectionprivate static ThreadLocal<Connection> connectionHolder=new ThreadLocal<Connection>();/** * 获取连接 * @return */public static Connection GetConnection(){Connection conn=connectionHolder.get();if(conn==null){try {JdbcConfig jdbcConfig=XmlConfigReader.GetInstance().getJdbcConfig();Class.forName(jdbcConfig.getDriverName());conn=DriverManager.getConnection(jdbcConfig.getUrl(),jdbcConfig.getUserName(),jdbcConfig.getPassword());} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}connectionHolder.set(conn);}return conn;}    //关闭连接public static void closeConnection() {Connection conn = connectionHolder.get();if (conn != null) {try {conn.close();//从ThreadLocal中清除ConnectionconnectionHolder.remove();} catch (SQLException e) {e.printStackTrace();}}}//关闭Statement(用于执行静态 SQL 语句并返回它所生成结果的对象。)public static void close(Statement pstmt) {if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}}//关闭结果集public static void close(ResultSet rs ) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}//开启事务public static void beginTransaction(Connection conn) {try {if (conn != null) {if (conn.getAutoCommit()) {conn.setAutoCommit(false); //手动提交}}}catch(SQLException e) {}}//提交事务public static void commitTransaction(Connection conn) {try {if (conn != null) {if (!conn.getAutoCommit()) {conn.commit();}}}catch(SQLException e) {}}//回滚事务public static void rollbackTransaction(Connection conn) {try {if (conn != null) {if (!conn.getAutoCommit()) {conn.rollback();}}}catch(SQLException e) {}}}


 

热点排行