JDBC:編寫通用的 JDBCUtils工具類

基本上已經可以應付常用方法

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();
		}
	}
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章