在做考试系统的时候,当使用到事务的时候,为保证各个方法都是使用同一个连接,我们需要把连接传来传去的。
这里,我们采用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) {}
}
}
分享到:
相关推荐
ThreadLocal是Java提供的一种线程局部变量,它为每个线程创建并维护一个独立的变量副本,使得每个线程只能访问自己内部的变量,互不干扰。在多线程环境下,ThreadLocal能帮助我们避免共享状态的并发问题,提升程序的...
ThreadLocal 的应用场景非常广泛,例如,在同一服务方法中调用多个 Dao 方法时,可以使用 ThreadLocal 来维护 Connection 对象,达到事务的目的。 例如,在服务层的代码中,可以使用 ThreadLocal 来维护 ...
这个副本存储在线程的ThreadLocalMap中,这个Map是由Thread类维护的,键是ThreadLocal对象,值是线程局部变量的副本。 使用ThreadLocal的步骤如下: 1. 创建ThreadLocal实例。 2. 使用`set`方法设置线程局部变量的...
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...
当Java事务与ThreadLocal结合使用时,可以在不同的线程中维护各自的事务状态,比如在Spring框架中,每个线程的ThreadLocal可以存储一个TransactionStatus对象,这样就可以在线程内部管理当前事务的状态,而不会影响...
3. **日志记录**:在多线程环境中,`ThreadLocal`可以用于维护每个线程的日志上下文,如线程ID、用户名等,便于日志信息的记录和分析。 4. **性能优化**:在某些计算密集型应用中,`ThreadLocal`可以用于缓存线程...
private static final ThreadLocal<Connection> connectionHolder = new ThreadLocal(); public void serviceMethod() { try (Connection conn = getConnection()) { conn.setAutoCommit(false); ...
但是,由于 `ThreadLocal` 的设计特性,其内部维护了一个与线程关联的弱引用表。只有当线程结束后,`ThreadLocal` 中的引用才会消失。而 Tomcat 中,每个请求都会创建新的线程来处理,这些线程在处理完请求后,通常...
通过为每个线程创建独立的变量副本,它不仅简化了代码,还提高了程序的可维护性和安全性。需要注意的是,尽管使用了弱引用来避免内存泄漏,但仍需谨慎管理`ThreadLocal`实例的生命周期,确保及时释放不再使用的资源...
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal 整理 ThreadLocal 是 Java 中的一个重要组件,它能够在每个线程中保持独立的副本。这个功能是通过 Thread 类中的 threadLocals 属性来实现的,这个属性实际上是一个 Entry 数组,其中的每个 Entry 都...
- **内部类ThreadLocalMap**:ThreadLocal在每个线程内部维护了一个名为ThreadLocalMap的哈希映射表,这个表的键是ThreadLocal对象,值是线程局部变量的实际值。这样,每个线程都可以拥有自己的变量副本,互不干扰。...
理解并熟练应用这些概念和技术,对于提升Java开发者的技能水平,优化代码的可读性和可维护性具有重要作用。在实际开发中,灵活运用设计模式可以提高代码质量,而ThreadLocal则为处理多线程环境下的数据隔离提供了一...
Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...
4. HTTP相关:虽然题目中没有直接涉及,但HTTPClient是一个常见的网络通信工具,经常和ThreadLocal结合使用,比如每个线程维护一个HttpClient实例,以提高性能和管理连接。 文件内容概览: - `HttpClient学习笔记....
- **代码可读性和可维护性**:`ThreadLocal`的使用可能使代码变得复杂,不易于理解和调试,尤其是在多线程环境下的问题排查。 总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多...
在Java编程中,ThreadLocal是线程局部变量的类,它提供了一种在多线程环境中为每个线程创建和维护独立副本的机制。ThreadLocal主要用于解决线程间的数据隔离问题,确保各线程拥有自己的变量副本,避免了数据共享带来...