这是一个连接数据库的管理程序,使用DataSource连接池管理连接的总数量,同时使用了ThreadLocal(连接线程池,一个线程的连接永远使用的是该线程的链接对象)。具体代码如下:
public class ConnectionManager {
private static ThreadLocal<Connection> remoteConnection = new ThreadLocal<>();
private static DataSource dataSource = new BasicDataSource();
static {
// 配置文件:resources/database.properties
ResourceManager resourceManager = ResourceManager.load("database");
String driver = resourceManager.getString("jdbc.driver");
String url = resourceManager.getString("jdbc.url");
String user = resourceManager.getString("jdbc.user");
String password = AesUtil.decrypt(resourceManager.getString("jdbc.password"));
// 下面取代了Class.forName()(或DbUtils.loadDriver)和DriverManager.getConnection()。
BasicDataSource source = (BasicDataSource) dataSource;
source.setDriverClassName(driver);
source.setUrl(url);
source.setUsername(user);
source.setPassword(password);
}
/**
* 取得连接对象
* @return 连接对象
*/
public static Connection getConnection() throws SQLException {
Connection conn = remoteConnection.get();
if (conn == null) {
conn = dataSource.getConnection();
remoteConnection.set(conn);
}
return conn;
}
/**
* 关闭连接
*/
public static void close() throws SQLException {
getConnection().close();
remoteConnection.remove(); // 移除掉,或者set(null)
}
/**
* 提交事务
*/
public static void commit() throws SQLException {
getConnection().commit();
}
/**
* 回滚事务
*/
public static void rollback() throws SQLException {
getConnection().rollback();
}
/**
* 设为自动调焦
* @param flag true是自动提交(默认);false是事务(手动)提交
*/
public static void setTransaction(boolean flag) throws SQLException {
getConnection().setAutoCommit(flag);
}
/**
* 查看当前是否是事务提交
* @return true是事务(手动)提交;false是自动提交
*/
public static boolean getTransaction() throws SQLException {
return !getConnection().getAutoCommit();
}
}