当前位置:Gxlcms > 数据库问题 > JDBC浅谈(二)

JDBC浅谈(二)

时间:2021-07-01 10:21:17 帮助过:2人阅读

connection.setAutoCommit(false); //将JDBC的自动事务关闭 2 connection.commit(); //手工提交事务 3 connection.rollback(); //手工回滚事务

     仅仅在Service层中写入这些代码是完全不行的,因为JDBC事物的控制代码依托于Connection对象,而Connectoin对象有JDBCUtil工具类获取,每次调用JDBCUtil.getConnection()方法的时候,JDBC都会返回一个新的Connection对象。而我们在DAO层和Service层需要用同一个Connection对象,单纯的用JDBCUtil工具类来获得Connection对象是不可取的。因为我们每次都是通过JDBCUtil来获取connection对象的,所以我们应该想办法,让在DAO和Service层利用JDBCUtil获取到同一个Connection对象。JDBCUtil代码如下:

    

public class JDBCUtil{
  
  static{
    
private static ThreadLocal tl = new ThreadLocal();
    Class.forName("com.mysql.jdbc.Driver");
  }
  
  //创建连接 public static Connection getConnection(){ Connection conn = tl.get(); //加载驱动 if(conn==null){ conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","12345678"); } return conn; } //关闭资源 public static void close(Conection conn,PreparedStatement pstmt,ResultSet rs){ if(rs!=null){ rs.close(); } if(pstmt!null){ pstmt.close(); } if(conn!=null){ conn.close(); } }

 

    ThreadLocal对象实现对象的线程绑定,tl.get()获得该线程中存的对象,tl.set()是将该对象存入该线程中。由此可以看出,通过ThreadLocal进行线程绑定的对象,只要是同一个线程,便能获得同一个对象。而之前我们需要在DAO和Service中使用同一个Connection对象,所以我们可以将Connection对象进行线程绑定。这样,代码在run的过程中,同一功能层面的DAO和Service调用的便是同一个Connection对象。

    ps、启用事务之后,JDBC的Connection资源应该在Service层关闭,其他资源在DAO中关闭。

JDBC浅谈(二)

标签:

人气教程排行