[Java]具备全程事务控制的JDBC连接管理器
Hibernate事务具备全局管理能力,配合Spring框架就可以在BO层完成DAO操作和事务控制。当然,传统的JDBC是不具备这个能力的,所以要自己开发一个连接管理器框架,来管理线程范围内的数据库连接和事务控制。
[java]
package edu.softparty.base.dbunit;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
/**
* 连接管理器类
*/
public class ConnectionManager {
/**
* 空的事务对象
*/
private static final Transaction EMPTY_TRANSACTION = new Transaction() {
public void rollback() throws SQLException {
}
public void commit() throws SQLException {
}
};
/**
* 负责提交和回滚的事务对象
*/
private static final Transaction TRANSACTION = new Transaction() {
public void rollback() throws SQLException {
Connection connection = connectionHolder.get();
if (connection != null) {
if (connection.getAutoCommit() == false) {
connection.rollback();
}
connection.close();
connectionHolder.remove();
}
}
public void commit() throws SQLException {
Connection connection = connectionHolder.get();
if (connection != null) {
if (connection.getAutoCommit() == false) {
connection.commit();
}
connection.close();
connectionHolder.remove();
}
}
};
// 线程本地对象管理器
private static final ThreadLocal<Connection> connectionHolder = new ThreadLocal<>();
// 数据源
private DataSource dataSource;
/**
* 构造器
* @param dataSource 数据源对象
*/
ConnectionManager(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* 获取数据库连接
* @return 数据库连接
* @throws SQLException
*/
public Connection getConnection() throws SQLException {
Connection connection = connectionHolder.get();
if (connection == null) {
connection = dataSource.getConnection();
connectionHolder.set(connection);
}
return connection;
}
/**
* 启动事务
* @return 事务管理对象
* @throws SQLException
*/
public Transaction beginTransaction() throws SQLException {
Connection connection = getConnection();
if (connection.getAutoCommit()) {
connection.setAutoCommit(false);
}
return TRANSACTION;
}
/**
* 获取事务
* @return
* @throws SQLException
*/
public Transaction getTransaction() {
return connectionHolder.get() == null ? EMPTY_TRANSACTION : TRANSACTION;
}
/**
* 关闭数据库连接
* @throws SQLException
*/
public void close() throws SQLException {
Connection connection = connectionHolder.get();
if (connection != null) {
connection.close();
connectionHolder.remove();
}
}
/**
* 释放资源
* @param rs 结果集对象
* @param stm 命令集对象
* @throws SQLException
*/
public void release(ResultSet rs, Statement stm) throws SQLException {
if (rs != null) {
rs.close();
}
if
补充:软件开发 , Java ,