JDBC----數據庫連接池(connection pool)


•數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個

•數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。

數據庫連接池的工作原理


數據庫連接池技術的優點

•資源重用:
–由於數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。
•更快的系統反應速度
–數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置於連接池中備用。此時連接的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間
•新的資源分配手段
–對於多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用獨占所有的數據庫資源
•統一的連接管理,避免數據庫連接泄露
–在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規數據庫連接操作中可能出現的資源泄露

兩種開源的數據庫連接池

•JDBC的數據庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Weblogic, WebSphere, Tomcat)提供實現,也有一些開源組織提供實現:
–DBCP 數據庫連接池
•DBCP 是 Apache軟件基金組織下的開源連接池實現,該連接池依賴該組織下的另一個開源系統:Common-pool. 如需使用該連接池實現,應在系統中增加如下兩個 jar 文件:
–Commons-dbcp.jar:連接池的實現
–Commons-pool.jar:連接池實現的依賴庫
•Tomcat 的連接池正是采用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可由應用程序獨立使用。
<span style="color:#ff0000;">/**
	 * 使用 DBCP 數據庫連接池
	 * 1. 加入 2 個jar 包(commons-dhcp,commons-pools). 依賴於 Commons Pool
	 * 2. 創建數據庫連接池
	 * 3. 為數據源實例指定必須的屬性
	 * 4. 從數據源中獲取數據庫連接
	 * @throws SQLException 
	 */</span>
	@Test
	public void testDBCP() throws SQLException {
		final BasicDataSource dataSource = new BasicDataSource();
		// 2、為數據源實例指定必須的屬性
		dataSource.setUsername("root");
		dataSource.setPassword("root123");
		dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/cjl");
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		// 3、指定數據源的一些可選屬性
		// 3.1、指定數據庫連接池中出使化連接數的個數
		dataSource.setInitialSize(5);
		// 3.2、指定最大連接數:同意時刻可以同時向數據庫申請的連接數
		dataSource.setMaxActive(5);
		// 3.3、指定最小連接數:在數據庫連接池中保存的最少的空閑連接的數量
		dataSource.setMinIdle(2);
		// 3.4、等待數據庫連接池分配連接的最長時間。單位為毫秒。超出時間將拋出異常
		dataSource.setMaxWait(1000 * 5);
		// 4、從數據源中獲取數據庫連接
		Connection connection = dataSource.getConnection();
		System.out.println(connection.getClass());
		
		connection = dataSource.getConnection();
		System.out.println(connection.getClass());
		
		connection = dataSource.getConnection();
		System.out.println(connection.getClass());
		
		connection = dataSource.getConnection();
		System.out.println(connection.getClass());
		
		Connection connection2 = dataSource.getConnection();
		System.out.println(">"+connection2.getClass());
		new Thread(){
			public void run(){
				Connection conn;
				try {
					conn=dataSource.getConnection();
					System.out.println(conn.getClass());
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}.start();
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		connection2.close();
	}


–C3P0 數據庫連接池
•DataSource 通常被稱為數據源,它包含連接池和連接池管理兩個部分,習慣上也經常把 DataSource 稱為連接池


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM