`
jiakechong
  • 浏览: 208983 次
社区版块
存档分类
最新评论

终于运用ThreadLocal实现了Connection和Transaction的管理

    博客分类:
  • java
阅读更多
终于运用ThreadLocal实现了Connection和Transaction的管理

http://www.cjsdn.net/post/print?bid=2&id=89152

测试用例(部分)通过


    public void testBeginTransaction() throws TransactionException,SQLException {
        Transaction tx = null;
        try {
            tx = ConnectionManager.beginTransaction();
           
            assertEquals("aaa",findProduct16());
           
            updateProduct16();
            assertEquals("萝卜",findProduct16());
           
            assertEquals("Alice Mutton",findProduct17());
            updateProduct17();
            //assertEquals("白菜",findProduct17());
           
            tx.commit();
            assertTrue(tx.wasCommitted());
            /*
            tx.commit();
            assertTrue(tx.wasCommitted());
            assertEquals("萝卜",findProduct16());
            */
           
            /*
            tx.rollback();
            assertTrue(tx.wasRolledBack());
            assertEquals("aaa",findProduct16());
            assertEquals("Alice Mutton",findProduct17());
            */
           
        } catch (TransactionException e) {
            tx.rollback();
            assertTrue(tx.wasRolledBack());
            throw e;
        } catch (SQLException e) {
            tx.rollback();
            assertTrue(tx.wasRolledBack());
            //throw new TransactionException(e);
        }
       
        assertTrue(ConnectionManager.currentConnection().getAutoCommit());
    }


更新了一下

dao.rar (780.49k)
2.Re:终于运用ThreadLocal实现了Connection和Transaction的管理 [Re: wes109] Copy to clipboard
Posted by: wes109
Posted on: 2004-04-23 13:13

主要的管理类


public class ConnectionManager {
    private static final ThreadLocal connection = new ThreadLocal();
    private static ConnectionFactory factory;
    private static boolean initialized = false;
    private static final Log log = LogFactory.getLog(ConnectionManager.class);

    private ConnectionManager() {
        super();
    }

    private synchronized static void initialize() {
        try {
            factory = new Configuration().configure().buildConnectionFactory();
        } catch (ConfigureException e) {
            log.fatal(e);
        }
        log.info("ConnectionManager initialize success");
        initialized = true;
    }

    public static Connection currentConnection() throws SQLException {
        if(!initialized) {
            initialize();
        }
        Connection conn = (Connection)connection.get();
        if(conn == null) {
            conn = factory.openConnection();
            connection.set(conn);
        }
        return conn;
    }

    public static void closeConnection() throws SQLException {
        Connection conn = (Connection)connection.get();
        connection.set(null);
        if(conn != null) {
            conn.close();
        }
    }

    public static Transaction beginTransaction() throws TransactionException{
        Connection conn = null;
        try {
            conn = currentConnection();
        } catch (SQLException e) {
            log.error("Can't get current connection with SQLException:",e);
            throw new TransactionException("Begin tracsaction fail with SQLException:", e);
        }
       
        return new TransactionFactory().beginTransaction(conn);
    }
}
分享到:
评论

相关推荐

    事务的封装和Threadlocal实例

    总的来说,结合JDBC的事务管理和ThreadLocal,我们可以在多线程环境中更好地实现数据库操作,确保数据的一致性,并提高代码的可复用性和安全性。通过使用ThreadLocal,我们可以创建线程安全的变量,使得每个线程都能...

    javaWeb实现事务1

    在上述的描述和代码中,展示了一种使用ThreadLocal实现的简单事务管理策略,它主要用于处理数据库操作时的一致性。以下是对这个实现的详细解析: 1. **ThreadLocal的使用**: ThreadLocal是Java中的一个类,用于在...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    Atomikos是著名的JTA(Java Transaction API)实现之一,提供了分布式事务管理的能力。AtomikosDataSource是基于Atomikos实现的XAPool,可以协调跨多个数据源的ACID(原子性、一致性、隔离性和持久性)事务。在...

    Java jdbc三层及事务(转账案例)

    在Java JDBC中,我们可以使用Connection对象的setAutoCommit(false)方法来关闭自动提交,然后手动控制事务的开始(startTransaction)、提交(commit)和回滚(rollback)。例如,在转账操作中,如果两个账户的扣款...

    java事务 - 模板设计模式

    在事务管理中,我们可以在ThreadLocal中存储当前线程的`Connection`对象,这样每个线程都有自己的事务上下文,避免了并发问题。 在文件`Transaction3`中,可能包含了具体实现上述模板设计模式的Java代码,包括`...

    课程hibernate的事务和并发.pdf

    这种方式被称为ThreadLocal Session和Open Session in View模式,能够简化事务和Session的生命周期管理。 在实际应用中,需要确保正确地开启和结束Session及事务,并将其与数据访问操作结合。HibernateUtil类可以...

    DBUtils操作数据库以及事物的管理

    C3P0是一个开放源代码的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 1. **添加依赖**: - 添加DBUtils和C3P0的jar包到项目中。 - 如果使用Maven或者Gradle等构建工具,则可以在`pom...

    hibernate的事务和并发资料.pdf

    为了实现这一模式,推荐使用拦截器(如ServletFilter)结合ThreadLocal来管理Session和事务,这样可以在处理请求的线程中方便地访问和管理Session。 此外,Hibernate还提供了辅助API来支持行级悲观锁定,利用`...

    基金购买系统

    为了实现这一机制,开发人员可能使用了诸如Spring框架的`@Transactional`注解或者手动调用`Connection`对象的`beginTransaction()`、`commit()`和`rollback()`方法。在每个线程的生命周期内,ThreadLocal会存储这个...

    spring事务精髓

    Spring通过AOP(面向切面编程)实现事务管理,使得事务可以在不侵入业务逻辑代码的情况下进行控制,提高了代码的可维护性和可复用性。 在描述中提到的代码示例展示了两种不同的事务处理方式:一种是传统的 JDBC ...

    JAVA设计模式之事务处理

    此外,`DAOFactory`和`ConnectionManager`是两个设计模式的应用,前者可能是工厂模式,用于创建DAO实例,后者可能是单例模式,用于管理数据库连接。 事务的ACID属性(原子性、一致性、隔离性和持久性)是事务处理的...

    详细解释Spring与Hibernate的整合原理

    通过这种方式,我们可以完全利用 Spring 的 IoC 容器来管理 Hibernate 的配置和数据源,从而实现更高效、更简洁的开发模式。同时,Spring 还提供了强大的事务管理功能,可以通过简单的 XML 或注解配置实现对 ...

    JPA连接数据库,非常详细

    Java持久化API(Java Persistence API,简称JPA)是Java平台上的一个标准,用于管理和持久化应用程序中的对象到关系数据库。JPA通过提供对象/关系映射(ORM)功能,使得开发人员可以使用面向对象的方式来操作数据库...

    Java事务总结.docx

    为了保证事务的一致性,可以利用`ThreadLocal`来封装`Connection`,确保在同一事务中的DAO类获取的是同一个`Connection`。 #### JTA事务 JTA(Java Transaction API)用于管理分布式事务。一个完整的JTA事务包括一...

    C#根据时间产生ID编号

    [System.InvalidOperationException] = {"ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction ...

    Spring 2.0 开发参考手册

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...

    Spring中文帮助文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring API

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

Global site tag (gtag.js) - Google Analytics