代码调用DruidDataSource来管理conn连接,同时声明了ThreadLocal对象来保存每次线程请求所获取的连接,这样可以避免每个new一个JDBCUtils对象,将conn对象放在ThreadLocal对象中缓存起来,下次调用直接从ThreadLocal中获取来实现性能的提高。
package com.util; import java.sql.Connection; import java.sql.SQLException; import com.alibaba.druid.pool.DruidDataSource; /** * JDBC封装类 * @author DC * */ public class JDBCUtils{ private static DruidDataSource dataSource = new DruidDataSource(); //声明线程共享变量 public static ThreadLocal<Connection> container = new ThreadLocal<Connection>(); //配置说明,参考官方网址 //http://blog.163.com/hongwei_benbear/blog/static/1183952912013518405588/ static{ dataSource.setUrl("jdbc:mysql://182.92.222.140:3306/idotest?useUnicode=true&characterEncoding=UTF-8"); dataSource.setUsername("username");//用户名 dataSource.setPassword("password");//密码 dataSource.setInitialSize(2); dataSource.setMaxActive(20); dataSource.setMinIdle(0); dataSource.setMaxWait(60000); dataSource.setValidationQuery("SELECT 1"); dataSource.setTestOnBorrow(false); dataSource.setTestWhileIdle(true); dataSource.setPoolPreparedStatements(false); } /** * 获取数据连接 * @return */ public static Connection getConnection(){ Connection conn =null; try{ conn = dataSource.getConnection(); System.out.println(Thread.currentThread().getName()+"连接已经开启......"); container.set(conn); }catch(Exception e){ System.out.println("连接获取失败"); e.printStackTrace(); } return conn; } /***获取当前线程上的连接开启事务*/ public static void startTransaction(){ Connection conn=container.get();//首先获取当前线程的连接 if(conn==null){//如果连接为空 conn=getConnection();//从连接池中获取连接 container.set(conn);//将此连接放在当前线程上 System.out.println(Thread.currentThread().getName()+"空连接从dataSource获取连接"); }else{ System.out.println(Thread.currentThread().getName()+"从缓存中获取连接"); } try{ conn.setAutoCommit(false);//开启事务 }catch(Exception e){ e.printStackTrace(); } } //提交事务 public static void commit(){ try{ Connection conn=container.get();//从当前线程上获取连接if(conn!=null){//如果连接为空,则不做处理 if(null!=conn){ conn.commit();//提交事务 System.out.println(Thread.currentThread().getName()+"事务已经提交......"); } }catch(Exception e){ e.printStackTrace(); } } /***回滚事务*/ public static void rollback(){ try{ Connection conn=container.get();//检查当前线程是否存在连接 if(conn!=null){ conn.rollback();//回滚事务 container.remove();//如果回滚了,就移除这个连接 } }catch(Exception e){ e.printStackTrace(); } } /***关闭连接*/ public static void close(){ try{ Connection conn=container.get(); if(conn!=null){ conn.close(); System.out.println(Thread.currentThread().getName()+"连接关闭"); } }catch(SQLException e){ throw new RuntimeException(e.getMessage(),e); }finally{ try { container.remove();//从当前线程移除连接切记 } catch (Exception e2) { e2.printStackTrace(); } } } //简单使用方式 public static void main(String[] args) throws SQLException { //select查询 /*Connection conn = JDBCUtils.getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT 1"); ResultSet rs = ps.executeQuery(); JDBCUtils.close();*/ //update,insert,delete操作 Connection conn2 = JDBCUtils.getConnection(); //开启事务1 JDBCUtils.startTransaction(); System.out.println("执行事务操作111111111111111...."); JDBCUtils.commit(); //开启事务2 JDBCUtils.startTransaction(); System.out.println("执行事务操作222222222222...."); JDBCUtils.commit(); JDBCUtils.close(); for (int i = 0; i < 2; i++) { new Thread(new Runnable() { public void run() { Connection conn2 = JDBCUtils.getConnection(); for (int i = 0; i < 2; i++) { JDBCUtils.startTransaction(); System.out.println(conn2); System.out.println(Thread.currentThread().getName()+"执行事务操作。。。。。。。。。。。。。"); JDBCUtils.commit(); } JDBCUtils.close(); } }).start(); } } }