在做考试系统的时候,当使用到事务的时候,为保证各个方法都是使用同一个连接,我们需要把连接传来传去的。
这里,我们采用ThreadLocal维护Connection可以避免这种情况。
ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。
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 { //用于保存connection private 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 block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } connectionHolder.set(conn); } return conn; } //关闭连接 public static void closeConnection() { Connection conn = connectionHolder.get(); if (conn != null) { try { conn.close(); //从ThreadLocal中清除Connection connectionHolder.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) {} } }