數據庫連接池你用了嗎
數據庫連接的建立及關閉是一種極耗系統資源的操作,尤其是在多層結構的應用環境中,這種資源的耗費對系統性能影響尤為明顯。在工作時做系統優化對這方面的很有體會,相同功能的查詢語句,由于打開關閉數據庫連接的次數不同導致兩個查詢語句耗費的時間差別很大。一個數據庫連接對象均對應一個物理數據庫連接,每次操作都打開一個物理連接,使用完后立即關閉連接。頻繁地打開、關閉連接將會造成系統性能低下。雖然寫高性能的sql語句能夠減少訪問數據庫的次數,但是也不能完全規避平凡操作數據庫的的行為,因為有時候我們訪問量大,就會伴有多線程和高并發,這時候我們就該考慮還有什么辦法能提高系統的性能了。辦法總比問題多,數據庫連接池的使用幫我們大大的降低了平凡的開關數據庫。
數據庫連接池的解決方案是:當應用程序啟動時,系統主動建立足夠的數據庫連接,并將這些連接組成一個連接池。每次應用程序請求數據庫連接時,無須重新打開連接,而是從池中取出已有的連接使用,使用完后,雖然使用了close()關閉連接,但是沒有真正關閉數據庫連接,而是直接將連接歸還給了連接池。通過使用連接池,將大大提高程序運行效率。
1、數據庫連接池是Connection對象的工廠。數據庫連接池的常用參數有如下:
● 數據庫的初始連接數
● 連接池的最大連接數
● 連接池的最小連接數
● 連接池的每次增加的容量
... ...
2、JDBC的數據庫連接池使用javax.sql.DataSource來表示,DataSource只是一個接口,該接口通常由商用服務器(如webLogic、WebSphere)等提供實現,也有一些開源組織提供實現(如DBCP和 C3P0等)。商用的我就不多介紹了,一般都是根據提示配置一下就可以使用了。下面簡單的說一下上面這兩個開源的常用配置屬性,真用到了還可以參考文檔進行詳細的配置。
3、DBCP(DataBaseconnection pool),數據庫連接池。是apache上的一個java連接池,也是tomcat使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。下面是一些常用的設置屬性
//創建數據源對象 BasicDataSource ds = new BasicDataSource(); //設置連接池所需的驅動(以MySql為例) ds.SetDriverClassName("com.mysql.jdbc.Driver"); //設置連接數據庫的url ds.setUrl("jdbc:mysql://localhost:3306/javaee"); //設置連接數據庫的用戶名 ds.setUsername("root"); //連接數據庫的密碼 ds.setPassword("root"); //設置連接池的初始連接數 ds.setInitia1Size(5); //設置連接池最多可有有多少個活動連接數 ds.setMaxActive(10); //設置連接池中最少有2個空閑的連接 ds.setMinIdle(2); //通過數據源獲取連接 Connection conn = ds.getConnection(); //釋放數據庫連接 Conn.close(); |
數據源和數據庫連接不同,數據源無須創建多個,它是產生數據庫連接的工廠,因此整個應用只需要一個數據源即可。建議把上面程序中的ds設置成static成員變最,并且在應用開始時立即初始化數據源對象,程序中所有需要獲取數據庫連接的地方直接訪問該ds對象,并獲取數據庫連接即可,當數據庫訪問結束后,程序還是像以前一樣關閉數據庫連接即可。
4、C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標準擴展。C3P0不僅可以自動清理不在使用的Connection,還可以自動清理Statement和ResultSet。目前使用它的開源框架有Hibernate,Spring等。
//創建連接池對象 ComboPooledDataSource ds = new ComboPooledDataSource(); //設置連接池所需的驅動(以MySql為例) ds.SetDriverClass("com.mysql.jdbc.Driver"); //設置連接數據庫的url ds.setJdbcUrl("jdbc:mysql://localhost:3306/javaee"); //設置連接數據庫的用戶名 ds.setUser("root"); //連接數據庫的密碼 ds.setPassword("root"); //設置連接池的最大連接數 ds.setMaxPoolSize(20); //設置連接池中最少連接數 ds.setMinPoolSize(2); //設置連接池的初始連接數 ds.setInitia1PoolSize(5); //設置連接池的緩存Statement的最大數 ds.setMaxStatements(100); //獲取連接 Connection conn = ds.getConnection(); //釋放數據庫連接 Conn.close(); |
看到了數據庫連接池的使用,我們是不是很快就會想到多線程編程里是不是也有線程池幫我們解決一些性能問題呢?答案肯定的,想到了就去嘗試吧......
posted on 2013-06-24 11:17 順其自然EVO 閱讀(534) 評論(0) 編輯 收藏 所屬分類: 數據庫