您的位置:首页 > 数据库

管理数据库连接和事务的工具类

2017-12-29 14:52 627 查看
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

/**
* 这个工具类就是来管理数据库连接和事务的
*
* @author user
*
*/
public class JDBCUtil {

// 数据连接池对象
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();;
// 事务专用连接,把事务存入到ThreadLocal中
private static ThreadLocal<Connection> tlConn = new ThreadLocal<Connection>();

/**
* 通过数据连接池获取连接
*
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
// 如果conn不为空,证明一件调用了beginTransaction方法,事务已经开启
Connection conn = tlConn.get();
if (conn != null)
return conn;
return dataSource.getConnection();
}

/**
* 获取数据连接池对象
*/
public static DataSource getDataSource() {
return dataSource;
}

/**
* 开启事务 获取Connection,设置它的setAutoCommit(false)
*
* @throws SQLException
*/
public static void beginTransaction() throws SQLException {
Connection conn = tlConn.get();
if (conn != null) {
throw new SQLException("事务已经开启,不能重复开启事务!");
}
// 给conn赋值
conn = getConnection();
// 把conn的事务设置为手动提交
conn.setAutoCommit(false);
// 把连接存入到ThreadLocal中
tlConn.set(conn);
}

/**
* 提交事务
*
* @throws SQLException
*/
public static void commitTransaction() throws SQLException {
Connection conn = tlConn.get();
if (conn == null) {
throw new SQLException("还没有开启事务,不能提交!");
}
// 提交事务
conn.commit();
// 把连接归还,并且赋值为NULL,是为了保证下次获取,不再是开始事务的连接
conn.close();
tlConn.remove();
}

/**
* 事务回滚
*
* @throws SQLException
*/
public static void rollbackTransaction() throws SQLException {
Connection conn = tlConn.get();
if (conn == null) {
throw new SQLException("还没有开启事务,不能回滚!");
}
conn.rollback();
conn.close();
tlConn.remove();
}

/**
* 释放连接
*
* @throws SQLException
*/
public static void closeConnection(Connection connection)
throws SQLException {
// 判断参数连接是否为事务连接,是就不关闭,不是再关闭
// 如果conn为NULL,证明没有开启事务,那么就关闭参数的connection
Connection conn = tlConn.get();
if (conn == null) {
connection.close();
} else if (conn != connection) {
// 如果conn不为NULL,但是与connection不是同一个连接,证明参数不是事务专用连接,那么也关闭connection
connection.close();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库
相关文章推荐