我是靠谱客的博主 高高啤酒,最近开发中收集的这篇文章主要介绍jdbc 学习总结四之事物控制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

事物是用户定义的一个操作序列,这些操作要不不做,要不全做。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

最后

以上就是高高啤酒为你收集整理的jdbc 学习总结四之事物控制的全部内容,希望文章能够帮你解决jdbc 学习总结四之事物控制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部