JDBC入門技術:如何使用連接池技術連接數據庫

工具:Myeclipse(eclipse)
知識點:線程(Thread)/連接池概念/IO流操作(Properties)
jar包
commons-collections4-4.0.jar
commons-dbcp-1.4.jar
commons-pool-1.6.jar
Oracle 11g 11.2.0.1.0 JDBC_ojdbc6.jar

步驟:
1
創建:
數據庫連接池對象BasciDataSource(不初始化)
線程對象ThreaLocal對象(不初始化)
配置文件對象Properties對象<>
配置文件路徑對象InputStream對象<>

2.
獲取
初始化數據庫連接池對象
使用連接池對象獲取配置文件中的信息
(如果要將字符串轉換爲int類型.使用包裝對象)

3.初始化
初始化線程對象

4.創建連接方法
覆蓋Connection中的getConnection()函數
注意:使用數據庫連接池對象獲取,
使用線程對象進行保存連接對象

覆蓋close()函數:
注意:
使用線程獲取的對象將對象來釋放資源.
這裏將資源釋放並不是將Connection對象連接關閉,
而是將連接歸還給連接池,給接下來的線程使用

比如:此時使用某一種東西.用完之後就會放回原處,給下一個人使用,
這兩可以重複使用減少數據庫的開銷

爲何要使用數據庫連接池?
數據庫連接的建立及關閉資源消耗巨大
傳統數據訪問方式:一次數據庫訪問對應一個物理連接.
每次操作數據庫都要打開,
關閉物理連接,系統性能嚴重受損

解決方案:
系統初始運行時,主動建立足夠的連接,組成一個池.
每次應用程序請求數據連接時無需重新打開連接,
而是從池中取出連接,使用完後,不在關閉而是歸還..

連接池中的使用規則:
應用啓動時.創建初始化數目的連接..
當申請時無連接可用或者達到指定的最小連接數,
按增量參數值創建新的連接

爲確保連接池中最小連接數的策略
動態檢查:定時檢查連接池,一旦發現數量小於最小連接數.
則補充相應的新連接,保證連接池正常運轉
靜態檢查
空閒連接不足時,系統才檢測是否達到最小連接數
按需分配,用過歸還,超時歸還


相當於:
客戶端和數據庫中間有一個連接池(抽象概念)

相當於生活中接口轉換器一樣

package com.csdn.jdbcdemo.date2017_11_12;


//如何使用連接池技術連接數據庫
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;


import org.apache.commons.dbcp.BasicDataSource;


public class BasicDataSourceDemo {
	//創建連接池對象
	private static BasicDataSource bs;
	
	//創建多線程對象
	private static ThreadLocal<Connection> td ;
	
	static{
		try{
		//配置對象
		Properties properties = new Properties();
		
		//配置文件路徑
		InputStream is 
			= BasicDataSourceDemo.
				class.getClassLoader().
					getResourceAsStream(
						"com/csdn/jdbcdemo/date2017_11_13/propertis.txt");
		
		//初始化連接池
		properties.load(is);
		is.close();
		
		bs = new BasicDataSource();
		
		//驅動器
		//Class.forName("oracle.jdbc.driver.OracleDriver")
		bs.setDriverClassName(
				properties.getProperty("driver"));
		
		//數據庫路徑
		bs.setUrl(properties.
				getProperty("url"));
		
		//數據庫用戶名
		bs.setUsername(
			properties.getProperty("username"));
		
		//數據庫的密碼
		bs.setPassword(properties.getProperty("password"));
		
		//線程初始化數量
		bs.setInitialSize(
			Integer.parseInt(
				properties.getProperty("initsize")));
		
		//線程最大數量
		bs.setMaxActive(
			Integer.parseInt(
				properties.getProperty("maxactive")));
		
		//最大等待時間
		bs.setMaxWait(
			Integer.parseInt(
				properties.getProperty("maxwait")));
		
		//最小空閒時間
		bs.setMinIdle(
				Integer.parseInt(
						properties.getProperty("minidle")));
		//最大空閒時間
		bs.setMaxIdle(
			Integer.parseInt(
				properties.getProperty("maxidle")));
		
		//初始化線程
		td = new ThreadLocal<Connection>();
		}catch(Exception e){
			e.printStackTrace();
			
		}
		}
		
	//獲取連接
	public static Connection getConnection() throws SQLException{
		Connection connection = bs.getConnection();
		td.set(connection);
		return connection;
	}
	
	//斷掉連接
	public static void closeConnection(){
		try{
		//
		Connection connection = td.get();
		if(connection != null){
			connection.close();
		}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}




下面是實現代碼:事先數據庫連接池技術:

package com.csdn.jdbcdemo.date2017_11_12;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class BasicDataSourceDemo2 {
	public static void main(String[] args) {
		
		try{
			//連接
			Connection connection = BasicDataSourceDemo.getConnection();
			
			//創建DB對象
			Statement state = connection.createStatement();
			
			//SQL語句
			String sql = "SELECT * FROM USER_INFO";
			
			//處理結果集
			ResultSet rs = state.executeQuery(sql);
			
			//遍歷結果
			while(rs.next()){
				System.out.println(
					rs.getString("ENAME")+"   "
					+rs.getInt("ID")+"   "
					+rs.getInt("SAL")+"   "
					+rs.getString("EMAIL")
					);
			}
			state.close();
			rs.close();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			BasicDataSourceDemo.closeConnection();
		}
	}
}


配置文件信息


#這個是驅動名
driver=oracle.jdbc.driver.OracleDriver
#這個是數據庫路徑
url=jdbc:oracle:thin:@<域名>:1521:<SID>
#這個是數據庫用戶名
username=xxxxxx
#這個是數據庫密碼
password=xxxxx
#線程初始化數量
initsize=1
#線程最大活動數量
maxactive=1
#線程等待時間
maxwait=5000
#線程空閒最小數量
minidle=1
#線程最大數量
maxidle=1




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