DBCP连接池和事物

工具类案例

 public static final String DRIVER = "com.mysql.jdbc.Driver";
     public static final String URL = "jdbc:mysql://localhost:3306" + "/java1203?useUnicode" + "=true&characterEncoding=UTF-8";
    public static final String USERNAME = "root";
     public static final String PASSWORD = "123456";
     /*
      * 创建连接池BasicDataSource
      */
     public static BasicDataSource dataSource = new BasicDataSource();
     //创建ThreadLoacl对象
     public static ThreadLocal<Connection> t=new ThreadLocal<Connection>();
    
    //静态代码块
     static {
        //对连接池对象 进行基本的配置
        dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
         dataSource.setUrl(URL); //指定要连接的数据库地址
         dataSource.setUsername(USERNAME); //指定要连接数据的用户名
         dataSource.setPassword(PASSWORD); //指定要连接数据的密码
     }
     /*
    * 返回连接池对象
     */
     public static DataSource getDataSource(){
         return dataSource;
     }

获得一条连接

//返回从连接池中获取一条连接
     public static Connection getconn()
    {
        Connection conn=null;
        try {
            conn=dataSource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
             e.printStackTrace();
         }
        return conn;
    }

事物实现案例

 //获取当前对象
     public static Connection getCurrentConn()
     {
         Connection conn=t.get();
         if(conn==null)
         {
             conn=getconn();
             t.set(conn);
         }
             return conn;
     }
     
     //开启事物
     public static void start()
     {
         try {
             getCurrentConn().setAutoCommit(false);
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
     
     //回滚事物
     public static void rollback()
     {
         try {
            getCurrentConn().rollback();
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
     
     //提交事务
    public static void commit()
     {
         try {
             getCurrentConn().commit();
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }

说明:在dao层获取Conn对象时使用此类的,getCurrentConn();静态方法

  或者使用连接池QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource());在此构造函数中传参

  

事物的使用:使用事物必须在dao层使用getCurrentConn();静态方法获取conn对象

例子:事物的使用位置

 public void transfer(String out,String in,double money)
     {
         try {
             //开始事物
             MyDBUtils.start();
            accountDao.jianMoney(out, money);//调用到层方法
             accountDao.jiaMoney(in, money);
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             //回滚
             MyDBUtils.rollback();
             e.printStackTrace();
         }finally{
             //提交事务
             MyDBUtils.commit();
        }
        
     }
原文地址:https://www.cnblogs.com/xiaozhang666/p/10679290.html