zoukankan      html  css  js  c++  java
  • 运用ThreadLocal解决jdbc事务管理

    JdbcUtils.java

    public class JdbcUtils {
        private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
        private static DataSource ds;
        
        static {
            ds = new ComboPooledDataSource();
        }
        
        public static DataSource getDataSource() {
            return ds;
        }
        
        // 当前线程绑定一个开启事务的连接
        // ThreadLocal是一个map集合 具有get() set() remove()方法 key是线程名称
        public static Connection getConnection() throws SQLException {
            Connection conn = tl.get();
            if (conn == null) {
                conn = ds.getConnection();
                tl.set(conn);            
            }
            return conn;
        }
        
        public static void startTransaction() {
            try {
                Connection conn = getConnection(); //调用
                if(conn != null) {
                    conn.setAutoCommit(false);
                }
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
        
        public static void rollback() {
            try {
                Connection conn = getConnection(); //调用
                if(conn != null) {
                    conn.rollback();
                    conn.commit();
                }
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
        
        public static void commit() {
            try {
                Connection conn = getConnection(); //调用
                if(conn != null) {
                    conn.commit();
                }
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
        
        public static void close() {
            try {
                Connection conn = getConnection(); //调用
                if(conn != null) {
                    try {
                        conn.close();
                    } finally {
                        tl.remove();
                    }                
                }
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
    }

    AccountService.java

    public class AccountService {
        
        // ThreadLocal 解决方案
        public void transfer(int sourceid,int destid,double money) throws SQLException {
            
            try {
                JdbcUtils.startTransaction();
                AccountDao dao = new AccountDao();
                
                Account a = dao.find(sourceid); //select
                Account b = dao.find(destid); //select
                
                a.setMoney(a.getMoney()-100);
                b.setMoney(b.getMoney()+100);
                
                dao.update(a); //update
                dao.update(b); //update

           JdbcUtils.commit(); } catch (Exception e) { JdbcUtils.rollback();
           throw new RuntimeException(); } finally { JdbcUtils.close(); } }
  • 相关阅读:
    用感知机(Perceptron)实现逻辑AND功能的Python3代码
    xpadder教程:自定义设置游戏手柄的图片
    用Python实现小说中的汉字频率统计
    天猫精灵X1智能音箱使用感想
    一道常被人轻视的前端JS面试题
    jQueryNotes仿QQ空间添加标记
    JQ对象到底是什么
    正则匹配规则
    自定义右键菜单
    IIS处理并发请求时出现的问题及解决
  • 原文地址:https://www.cnblogs.com/Knuth/p/2729011.html
Copyright © 2011-2022 走看看