基本上已经可以应付常用方法
1.为JDBCUtils 添加事务处理方法
2.处理多线程并发访问问题
package cn.cil.Utls;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
* 编写通用的 JDBCUtils 工具类
* @author Administrator
*
*/
public class JDBCUtiles1 {
/** 使用 c3p0 数据源 */
private static DataSource dataSource = null;
/** 使用ThreadLocal 解决多线程并发访问问题
* 其中存放的是,事务处理相关的 Connection 对象*/
private static ThreadLocal<Connection> locals = null;
/** 创建对象 */
static{
dataSource = new ComboPooledDataSource("c3p0Config");
locals = new ThreadLocal<>();
}
/**
* 获取 数据库连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
// 获取当前线程对应的连接,也就是当前访问的数据库连接
Connection conn = locals.get();
// 如果为空,说明没有开启事务,则返回空闲 连接
// 不为空,说明正在进行事务,所以必须是同一连接
return (conn != null)?conn:dataSource.getConnection();
}
/**
* 开始事务
* @throws SQLException
*/
public static void beginStraction() throws SQLException{
Connection conn = locals.get();
//如果本次访问,已经开始事务了,却再次开始事务,即上次事务还没有进行完,又开始事务,则抛出
if(conn != null)throw new SQLException("已经开始了事务");
conn = getConnection();
conn.setAutoCommit(false);
locals.set(conn); //向 ThreadLocal 填充 数据库连接
}
/**
* 提交事务
* @throws SQLException
*/
public static void commitStraction() throws SQLException{
Connection conn = locals.get();
// 判断事务是否开始了,如果还没有开始事务,则不能提交
if(conn == null)
throw new SQLException("还没有开始事务");
conn.commit();
conn.close();
locals.remove();//移走
}
/**
* 回滚事务
* @throws SQLException
*/
public static void rollbackStraction() throws SQLException{
Connection conn = locals.get();
if(conn == null)
throw new SQLException("无法回滚事务");
conn.rollback();
conn.close();
locals.remove();
}
/**
* 释放 连接,归还连接池
* @param connection
* @throws SQLException
*/
public static void release(Connection connection) throws SQLException{
Connection conn = locals.get();
if(conn == null){
connection.close();
}
if(conn != connection){
connection.close();
}
}
/**
* 释放 连接,关闭结果集
* @param connection
* @throws SQLException
*/
public static void relase(Connection connection,ResultSet rs) throws SQLException{
release(connection);
if(rs != null){
rs.close();
}
}
}