我们的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事务控制详解 在数据库应用开发中,事务管理是一项重要的功能,它确保了一系列操作能够作为一个整体被正确地执行或回滚。Java Database Connectivity (JDBC) 是 Java 平台中用于连接数据库的标准 API,提供...
非常常用的JavaEE四层架构下的纯JDBC事务控制简单解决方案。Eclipse工程。详情参看:http://blog.csdn.net/qjyong/archive/2010/04/08/5464835.aspx
本篇文章我们将深入探讨Spring JDBC事务控制,这是Spring框架中处理数据持久化的一个关键特性。Spring JDBC提供了对数据库事务的高级封装,使得开发者能够方便、高效地管理事务,而无需过多关注底层实现细节。 首先...
"JDBC事务管理的简单实现" 在JDBC编程中,事务管理是非常重要的一部分。为了实现数据一致性,需要在代码中显示的调用Connection方法的事务相关API来完成工作。下面是关于JDBC事务管理的简单实现的知识点。 一、...
当使用`JdbcTemplate`结合Spring框架时,可以采用与原生JDBC事务控制类似的方法,但在Spring环境中进行管理。以下是一个使用Druid数据库连接池的示例代码: ```java @RequestMapping("/druidData1") public String ...
**JDBC事务初探** Java Database Connectivity (JDBC) 是Java平台中用于访问数据库的标准API。在处理数据库操作时,事务管理是确保数据一致性、完整性和持久性的重要机制。本篇将深入探讨JDBC中的事务处理,以及...
JDBC事务管理是数据库...总之,JDBC事务管理是确保数据库操作正确性和一致性的关键,通过理解和应用ACID原则以及适当的并发控制机制,开发人员可以有效地处理并发环境下的事务处理,保证系统的稳定性和数据的完整性。
**JDBC事务**主要针对单个数据库连接,由数据库管理系统(DBMS)自身管理事务。JDBC提供了`Connection`对象的`commit()`和`rollback()`方法用于提交和回滚事务。这是简单的单阶段提交,适用于单一数据源的情况。 **...
标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...
“JDBC事务管理项目”涵盖了如何在Java应用中利用JDBC进行事务控制,包括开启手动事务、提交、回滚以及设置事务隔离级别等。理解并掌握这些知识对于开发健壮的数据库应用至关重要,能够确保数据的完整性和一致性。
`UserTransaction`接口主要用于开始、提交和回滚事务,而`TransactionManager`接口则提供了更精细的事务控制,如挂起和恢复事务。 在EJB(Enterprise JavaBeans)环境中,SessionBean可以利用容器提供的事务管理...
此外,JDBC事务控制也是重要的一环,通过`Connection`对象的`setAutoCommit()`和`commit()`/`rollback()`方法可以实现事务的开始、提交和回滚。 最后,理解JDBC异常处理也很关键,常见的如`SQLException`,需要正确...
首先,我们来看Spring与JDBC的事务控制。Spring提供了一种声明式事务管理的方式,允许开发者通过在方法上添加@Transactional注解来开启事务。例如,在Service层的方法上添加此注解,Spring会在方法执行前后自动处理...
### JDBC事务管理与分页策略详解 在Java开发中,JDBC(Java Database Connectivity)作为连接数据库的标准API,被广泛应用于数据操作。...在实际开发中,应根据具体需求和数据规模选择最合适的事务控制和分页方法。
为了能够手动控制事务,需要调用`Connection.setAutoCommit(false)`来关闭这一模式。 3. **执行SQL语句**:接下来就可以执行一系列的SQL语句了。这些语句可以包括插入、更新或删除等操作。 4. **提交或回滚事务**...
在这个压缩包“开源数据库连接池”中,我们找到了几个主流的Java数据库连接池实现,包括c3p0、DBCP等,以及与JDBC事务控制相关的PPT资料。以下将详细介绍这些内容。 首先,c3p0是一个开源的JDBC连接池,由Miquel ...
在IT行业中,数据库是存储和管理数据的核心工具,而JDBC(Java Database Connectivity)则是Java编程语言中用于访问和处理数据库的标准接口。...同时,这个转账业务场景也是对JDBC事务控制和SQL操作能力的很好实践。