1. 程式人生 > >在javaee的三層結構中,為什麽事物存在於業務層

在javaee的三層結構中,為什麽事物存在於業務層

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的三層結構中,為什麽事物存在於業務層