在javaee的三层结构中,为什么事物存在于业务层
admin
2023-05-03 20:21:49
0

我们都知道在javaee实际开发中,分为3层结构来开发,controller,service和dao

那么为什么事物要存在于业务层中,事物是通过connection对象操作的,使用原始jdbc链接数据库的链接也是connection操作的,connection是在到是怎么传递到dao的呢?

这里讲解两种方式
第一种通过形式参数的方式
在javaee的三层结构中,为什么事物存在于业务层
第二种通过ThreadLocal的方式
ThreadLocal的底层是个map,该map的key是固定的,当前线程。value可以让我们存入任意对象

在javaee的三层结构中,为什么事物存在于业务层

public class JdbcUtils {

    // 成员变量,创建了C3P0的连接池(连接池中已经存在连接了...)
    private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource();

    // 把Connection绑定到当前的线程中
    private static ThreadLocal tl = new ThreadLocal();

    /**
     * 返回的是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();
            }
        }
    }

}

相关内容

热门资讯

豪华邮轮病毒,横跨三大洲始末 5月11日,泛海探险公司确认,隶属于该公司的“洪迪厄斯”号邮轮抵达西班牙特内里费岛后,全部87名乘客...
苏泊尔球釜电饭煲不通电是什么原... 1、有可能是温度保险管出现了问题,每个电饭煲都有温度保险管,而不是家常用的保险丝,如果保险管出现了问...
九阳铁釜电饭煲不通电原因 1、可能是面板烧了。2、控制电路没有工作,先检查控制电源是否正常。电饭煲的面板显示器线路接触不良,找...
空调线控器出现“黑... 珠海总部对于退回的多联机线控器黑屏“故障”,部分是由于不清楚线控器的灯光功能,误触发线控器关闭了灯光...
长虹柜机温度传感器是多少K 每一个空调传感器的传感温度都会对应着不同的空调工作型号和参数,常见的有5K,10K和15K,当然在不...
测电笔测不出的漏电 1、如果漏电的电压比较低的话有时候测电笔就测试不出来的。2、有时候测电笔在出厂的时候没有检测好,就有...
“拖延毫无出路”:美智库疾呼出... 【文/观察者网 潘昱辰 编辑/高莘】“如果没有国家战略扶持,美国汽车产量将持续下滑,直接影响美国国家...
凤凰记者拍到空军一号飞抵首都机... “哪儿呢?”“来了,这!这!这!”5月13日晚,特朗普专机空军一号抵达北京首都机场 ,凤凰卫视记者拍...
黄仁勋最后时刻登上“空军一号”... 美国当地时间5月12日,美国总统特朗普启程访华。途中,“空军一号”于阿拉斯加加油停靠时,英伟达公司总...
美财长贝森特专机先期抵达北京 13日下午,在特朗普抵达前,美国财长贝森特的专机先期飞抵北京,凤凰卫视记者拍摄到了专机降落前的画面。