基本上已經可以應付常用方法
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();
}
}
}