在javaee的三層結構中,為什麽事物存在於業務層
阿新 • • 發佈:2018-03-01
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的三層結構中,為什麽事物存在於業務層