jdbc 学习总结四之事物控制
2016-09-12 17:19
357 查看
事物是用户定义的一个操作序列,这些操作要不不做,要不全做。jdbc默认设置为自动提交事物,即每个语句执行完毕之后自动提交。每个语句都隐含一个commit。
我们知道 JDBC中 connection提供了auto-commit这个属性来控制事物,但是必须建立在使用一个connection的情况下,这样我们的逻辑层代码和数据层代码只能写在一起,代码会有很多冗余,为了解决这个问题,我们可以在工具类中使用ThreadLocal 来控制保持同一个connection ,ThreadLocal是Thread的一个局部变量,将connection创建变量副本,大致原理 是将connection作为value将当前线程作为key,存放在HashMap中。
<pre name="code" class="java">private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
我们知道 JDBC中 connection提供了auto-commit这个属性来控制事物,但是必须建立在使用一个connection的情况下,这样我们的逻辑层代码和数据层代码只能写在一起,代码会有很多冗余,为了解决这个问题,我们可以在工具类中使用ThreadLocal 来控制保持同一个connection ,ThreadLocal是Thread的一个局部变量,将connection创建变量副本,大致原理 是将connection作为value将当前线程作为key,存放在HashMap中。
<pre name="code" class="java">private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
public static Connection getConnection(){ String url = prop.getProperty("url"); String username = prop.getProperty("username"); String password = prop.getProperty("password"); Connection connection = threadLocal.get(); if(connection == null){ try { connection = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } threadLocal.set(connection); } return connection; }
/** * 模拟 业务逻辑层 * <p>方法名称:</p> * <p>方法说明:</p> * @throws SQLException * @autho zx */ @Test public void test1() throws SQLException{ Connection cn = JDBCUtils.getConnection(); System.out.println("test1 -- connection :"+cn); cn.setAutoCommit(false); try { test2(); if(1==1){ /*throw new RuntimeException();*/ } test3(); cn.commit(); } catch (Exception e) { cn.rollback(); e.printStackTrace(); } cn.close(); } /** * 模拟 数据层 * <p>方法名称:</p> * <p>方法说明:</p> * @throws SQLException * @autho zx */ public void test2() throws SQLException{ String sql = "insert into t_user values(?,?,?,?)"; Connection cn = JDBCUtils.getConnection(); System.out.println("test2 -- connection :"+cn); PreparedStatement ps = cn.prepareStatement(sql); ps.setInt(1, 1); ps.setString(2, "zs"); ps.setString(3, "123456"); ps.setInt(4, 20); ps.executeUpdate(); ps.close(); } /** * 模拟数据层 * <p>方法名称:</p> * <p>方法说明:</p> * @throws SQLException * @autho zx */ public void test3() throws SQLException{ String sql = "insert into t_user values(?,?,?,?)"; Connection cn = JDBCUtils.getConnection(); System.out.println("test3 -- connection :"+cn); PreparedStatement ps = cn.prepareStatement(sql); ps.setInt(1, 2); ps.setString(2, "lisi"); ps.setString(3, "123456"); ps.setInt(4, 22); ps.executeUpdate(); ps.close(); }
test1 -- connectioncom.mysql.jdbc.JDBC4Connection@55c9be00 test2 -- connection :com.mysql.jdbc.JDBC4Connection@55c9be00 test3 -- connection :com.mysql.jdbc.JDBC4Connection@55c9be00
相关文章推荐
- JDBC学习精华总结
- 关于JDBC的学习总结,新手写的第一篇学习帖子
- JDBC第四章知识点总结——JDBC高级特性2--事务,并发控制,行集
- DBCP和JDBC学习总结(应用篇)
- [OOAD]面向对象分析与设计之控制驱动部分设计学习总结
- 牛人写的 JDBC学习-总结- -
- selenium webdriver 学习总结-Selenium 控制测试流_补充显示等待(五)
- jdbc学习总结3------javabean+dao
- jdbc学习总结2---使用占位符的增删改查
- Storm学习总结——消息的可靠性处理、一致性事物
- C# 学习总结 之 流程控制
- JDBC学习总结
- MyEclipse中JDBC连接SQLSERVER2005学习总结
- JDBC学习总结5-------使用了内部类后的改造
- JDBC学习总结
- Jdbc的学习,全面总结
- Java学习总结之第四章 流程控制
- JDBC连接池与数据源学习总结
- jdbc学习总结2---使用占位符的增删改查
- ArcGIS Geodatabase版本控制机制的学习总结