首页 > 代码库 > JDBC浅谈(二)

JDBC浅谈(二)

JDBC中的事务

  简单来说,事务就是要保证一组DAO方法的操作,要么一起成功要么一起失败。

  1、事务控制的位置

    在Service中的业务方法内进行事务控制。

  2、事务控制的代码

    a、注意:JDBC会自动把一条增、删、改的操作加入事务。(这样非常不好,因为有些情况是不需要添加事务的,容易产生问题)。

    b、推荐:手工控制事务:

      

1 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浅谈(二)