標籤:jdbc中的事物書寫
我們都知道在javaee實際開發中,分為3層結構來開發,controller,service和dao
那麼為什麼事物要存在於業務層中,事物是通過connection對象操作的,使用原始jdbc連結資料庫的連結也是connection操作的,connection是在到是怎麼傳遞到dao的呢?
這裡講解兩種方式
第一種通過形式參數的方式
第二種通過ThreadLocal的方式
ThreadLocal的底層是個map,該map的key是固定的,當前線程。value可以讓我們存入任意對象
public class JdbcUtils { // 成員變數,建立了C3P0的串連池(串連池中已經存在串連了...) private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource(); // 把Connection綁定到當前的線程中 private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); /** * 返回的是C3P0的串連池 * @return */ public static DataSource getDataSource(){ return DATASOURCE; } /** * 擷取串連,返回串連 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ Connection conn = null; // 從tl中擷取 conn = tl.get(); if(conn == null){ // 從串連池中擷取串連 conn = DATASOURCE.getConnection(); // 非常關鍵,把串連存入到tl中 tl.set(conn); } return conn; } /** * 開啟事務 * @throws SQLException */ public static void beginTransaction() throws SQLException{ // 調用getConnection() Connection conn = getConnection(); conn.setAutoCommit(false); } /** * 提交事務 * @throws SQLException */ public static void commitTransaction() throws SQLException{ // 調用getConnection() Connection conn = getConnection(); conn.commit(); } /** * 復原事務 * @throws SQLException */ public static void rollBackTransaction() throws SQLException{ // 調用getConnection() Connection conn = getConnection(); conn.rollback(); } /** * 歸還串連 * @throws SQLException */ public static void closeConn() throws SQLException{ // 調用getConnection() Connection conn = getConnection(); conn.close(); tl.remove(); } /** * 釋放資源 * @param stmt * @param conn */ public static void release(Statement stmt,Connection conn){ if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { // 已經變成了歸還了... conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 釋放資源 * @param stmt * @param conn */ public static void release(ResultSet rs,Statement stmt,Connection conn){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { // 把close()給修改了,原來是銷毀串連,現在讓方法變成歸還串連。 conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }}
在javaee的三層結構中,為什麼事物存在於業務層