设计一个jdbc工具类给别人用你会考虑哪些方面
想起之前面试被问到的一个题,整理一下思路
- 需求:线程池技术是否需要自定义自己写?还是用c3p0,还是用dbcp.用c3p0吧,spring里就用的这个.
- 配置:把信息写进c3p0-config.xml
- 导入包:c3p0-0.9.1.2.jar和commons-dbutils-1.4.jar和mysql-connector-java-5.0.4-bin.jar(我用的mysql数据库)
- 成员变量:一个静态的c3p0的数据库连接对象ComboPooledDataSource,一个静态的存放数据库连接对象的线程绑定对象ThreadLocal
- 定义接口:
- 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();
}
}