DataSourceUtils

设计一个jdbc工具类给别人用你会考虑哪些方面

想起之前面试被问到的一个题,整理一下思路

  1. 需求:线程池技术是否需要自定义自己写?还是用c3p0,还是用dbcp.用c3p0吧,spring里就用的这个.
  2. 配置:把信息写进c3p0-config.xml
  3. 导入包:c3p0-0.9.1.2.jar和commons-dbutils-1.4.jar和mysql-connector-java-5.0.4-bin.jar(我用的mysql数据库)
  4. 成员变量:一个静态的c3p0的数据库连接对象ComboPooledDataSource,一个静态的存放数据库连接对象的线程绑定对象ThreadLocal
  5. 定义接口:
  • getCurrentConnection()获取绑定在ThreadLocal上的连接对象,此操作目的在于使得service层可以获取与dao层同一连接对象(若无法获取同一连接对象,则事务回滚不奏效),以保证事务的acid中atomicity原子性.
  • startTransaction()开启事务
  • getConnection()从ComboPooledDataSource中获取一个连接对象
  • rollback()回滚事务
  • commit()提交事务,将Connection从ThreadLocal中移除,并关闭连接对象
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DataSourceUtils {
   //获得Connection ----- 从连接池中获取
   private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
   //创建ThreadLocal
   private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
   //开启事务
   public static void startTransaction() throws SQLException{
   	Connection conn = getCurrentConnection();
   	conn.setAutoCommit(false);
   }
   //获得当前线程上绑定的conn
   public static Connection getCurrentConnection() throws SQLException{
   	//从ThreadLocal寻找 当前线程是否有对应Connection
   	Connection conn = tl.get();
   	if(conn==null){
   		//获得新的connection
   		conn = getConnection();
   		//将conn资源绑定到ThreadLocal(map)上
   		tl.set(conn);
   	}
   	return conn;
   }
   public static Connection getConnection() throws SQLException{
   	return dataSource.getConnection();
   }
   //回滚事务
   public static void rollback() throws SQLException {
   	getCurrentConnection().rollback();
   }
   //提交事务
   public static void commit() throws SQLException {
   	Connection conn = getCurrentConnection();
   	conn.commit();
   	//将Connection从ThreadLocal中移除
   	tl.remove();
   	conn.close();
   }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值