您的位置:首页 > 其它

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>();

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: