`
Adan-Chiu
  • 浏览: 21798 次
社区版块
存档分类
最新评论

jdbc事务控制

    博客分类:
  • jdbc
 
阅读更多

       我们的dao层只是和数据库打交道的中间件,不涉及我们的业务逻辑,一般一个事务代表一个业务边界,所以我们的事务应该定义在service层上,由于我们的service是单例的,如何保证我当前的操作是线程安全的(即是在同一个连接上做的操作)。解决方案是使用ThreadLocal,它是线程绑定的变量,提供线程局部变量(ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。),我们将连接绑定在当前的线程上。

 

public class JdbcUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(JdbcUtil.class);
    private static ThreadLocal<Connection> currentConnection = new ThreadLocal<>();
    private static DataSource dataSource;
    static{
        try {
            var in = JdbcUtil.class.getClassLoader().getResourceAsStream("dbcp-config.properties");
            var prop = new Properties();
            prop.load(in);//数据源中已设置事务为手动提交
            dataSource = BasicDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            LOGGER.error(e.getMessage(),e);
        }
    }
    private JdbcUtil() {
    	
    }
    /**
     *   通过数据源获取连接对象
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        //从当前线程获取Connection对象
        var conn = currentConnection.get();
        if(conn == null){//如果连接为空,应该创建一个连接并且绑定到当前线程之上
            conn = dataSource.getConnection();
            //currentConnection.set(conn);
        }
        return conn;
    }

    /**
     * 获取数据源
     * @return 数据源
     */
    public static DataSource getDataSource(){
        return dataSource;
    }

    /**
     * 开启一个事务
     */
    public static void beginTransaction(){
        try {
            var conn = currentConnection.get();
            //如果连接不为空,表示当前事务没有结束(自动提交),不能开启新的事务
            if(conn != null) {
                throw new SQLException("事务已经开启,在没有结束当前事务时,不能再开启事务!");
            }
            conn = dataSource.getConnection();
            //开启事务
            conn.setAutoCommit(false);
            currentConnection.set(conn);
        } catch (SQLException e) {
            LOGGER.error(e.getMessage(),e);
        }
    }
    /**
     * 提交一个事务
     */
    public static void commit(){
        try {
            var conn = currentConnection.get();
            if(conn == null) {
                throw new SQLException("当前没有事务,不能提交事务!");
            }
            //提交事务
            conn.commit();
            conn.close();
            currentConnection.remove();
        } catch (SQLException e) {
            LOGGER.error(e.getMessage(),e);
        }
    }

    /**
     * 回滚一个事务
     */
    public static void rollback(){
        try {
            var conn = currentConnection.get();
            if(conn == null) {
                throw new SQLException("当前没有事务,不能回滚事务!");
            }
            //提交事务
            conn.rollback();
            conn.close();
            currentConnection.remove();
        } catch (SQLException e) {
            LOGGER.error(e.getMessage(),e);
        }
    }

    /**
     * 释放资源
     *      拿连接是从当前线程上的,释放应该将当前线程上的Connection对象移除掉
     * @param rs 结果集
     * @param stat 语句对象
     * @param conn 连接对象
     */
    public static void free(ResultSet rs, Statement stat,Connection conn){
        try {
            if(rs != null)
                rs.close();
        } catch (SQLException e) {
            LOGGER.error(e.getMessage(),e);
        }finally {
            try {
                if(stat != null)
                    stat.close();
            } catch (SQLException e) {
                LOGGER.error(e.getMessage(),e);
            }finally {
                try {
                    if(conn != null) {
                        currentConnection.remove();
                        conn.close();
                    }
                } catch (SQLException e) {
                    LOGGER.error(e.getMessage(),e);
                }
            }
        }
    }
}

 

 

 

分享到:
评论

相关推荐

    JDBC事务控制--讲述如何控制JDBC事务

    ### JDBC事务控制详解 在数据库应用开发中,事务管理是一项重要的功能,它确保了一系列操作能够作为一个整体被正确地执行或回滚。Java Database Connectivity (JDBC) 是 Java 平台中用于连接数据库的标准 API,提供...

    分层架构下的纯JDBC事务控制示例项目

    非常常用的JavaEE四层架构下的纯JDBC事务控制简单解决方案。Eclipse工程。详情参看:http://blog.csdn.net/qjyong/archive/2010/04/08/5464835.aspx

    小码农的代码(二)----------SpringJDBC事务控制

    本篇文章我们将深入探讨Spring JDBC事务控制,这是Spring框架中处理数据持久化的一个关键特性。Spring JDBC提供了对数据库事务的高级封装,使得开发者能够方便、高效地管理事务,而无需过多关注底层实现细节。 首先...

    JDBC事务管理的简单实现

    "JDBC事务管理的简单实现" 在JDBC编程中,事务管理是非常重要的一部分。为了实现数据一致性,需要在代码中显示的调用Connection方法的事务相关API来完成工作。下面是关于JDBC事务管理的简单实现的知识点。 一、...

    JdbcTemplate的事务控制.docx

    当使用`JdbcTemplate`结合Spring框架时,可以采用与原生JDBC事务控制类似的方法,但在Spring环境中进行管理。以下是一个使用Druid数据库连接池的示例代码: ```java @RequestMapping("/druidData1") public String ...

    JDBC的事务初探

    **JDBC事务初探** Java Database Connectivity (JDBC) 是Java平台中用于访问数据库的标准API。在处理数据库操作时,事务管理是确保数据一致性、完整性和持久性的重要机制。本篇将深入探讨JDBC中的事务处理,以及...

    JDBC事务管理.docx

    JDBC事务管理是数据库...总之,JDBC事务管理是确保数据库操作正确性和一致性的关键,通过理解和应用ACID原则以及适当的并发控制机制,开发人员可以有效地处理并发环境下的事务处理,保证系统的稳定性和数据的完整性。

    JDBC事务 JTA事务 传播特性 隔离级别

    **JDBC事务**主要针对单个数据库连接,由数据库管理系统(DBMS)自身管理事务。JDBC提供了`Connection`对象的`commit()`和`rollback()`方法用于提交和回滚事务。这是简单的单阶段提交,适用于单一数据源的情况。 **...

    spring JDBC事务管理

    标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...

    JDBC事务管理项目

    “JDBC事务管理项目”涵盖了如何在Java应用中利用JDBC进行事务控制,包括开启手动事务、提交、回滚以及设置事务隔离级别等。理解并掌握这些知识对于开发健壮的数据库应用至关重要,能够确保数据的完整性和一致性。

    JDBC事务处理机制探秘

    `UserTransaction`接口主要用于开始、提交和回滚事务,而`TransactionManager`接口则提供了更精细的事务控制,如挂起和恢复事务。 在EJB(Enterprise JavaBeans)环境中,SessionBean可以利用容器提供的事务管理...

    Oracle+MySql JDBC demo

    此外,JDBC事务控制也是重要的一环,通过`Connection`对象的`setAutoCommit()`和`commit()`/`rollback()`方法可以实现事务的开始、提交和回滚。 最后,理解JDBC异常处理也很关键,常见的如`SQLException`,需要正确...

    spring分别与jdbc和hibernate结合的事务控制--案例

    首先,我们来看Spring与JDBC的事务控制。Spring提供了一种声明式事务管理的方式,允许开发者通过在方法上添加@Transactional注解来开启事务。例如,在Service层的方法上添加此注解,Spring会在方法执行前后自动处理...

    jdbc事务及分页

    ### JDBC事务管理与分页策略详解 在Java开发中,JDBC(Java Database Connectivity)作为连接数据库的标准API,被广泛应用于数据操作。...在实际开发中,应根据具体需求和数据规模选择最合适的事务控制和分页方法。

    JavaBean中使用JDBC方式进行事务处理

    为了能够手动控制事务,需要调用`Connection.setAutoCommit(false)`来关闭这一模式。 3. **执行SQL语句**:接下来就可以执行一系列的SQL语句了。这些语句可以包括插入、更新或删除等操作。 4. **提交或回滚事务**...

    开源数据库连接池

    在这个压缩包“开源数据库连接池”中,我们找到了几个主流的Java数据库连接池实现,包括c3p0、DBCP等,以及与JDBC事务控制相关的PPT资料。以下将详细介绍这些内容。 首先,c3p0是一个开源的JDBC连接池,由Miquel ...

    jdbc.rar_数据库操作

    在IT行业中,数据库是存储和管理数据的核心工具,而JDBC(Java Database Connectivity)则是Java编程语言中用于访问和处理数据库的标准接口。...同时,这个转账业务场景也是对JDBC事务控制和SQL操作能力的很好实践。

Global site tag (gtag.js) - Google Analytics