JavaSpring數據庫連接池

在系統中頻繁的進行數據庫連接的創建和釋放是非常浪費計算機資源的行爲,而數據庫連接池能夠有效的緩解這種行爲。

數據庫連接池(Database Connection Pooling)是在程序初始化時創建一定數量的數據庫連接對象並保存在內存中,應用成勳可以重複的使用這些數據庫連接對象。

在數據庫連接池中有這樣幾個概念:

最小連接數:即數據庫連接池中初始化存在的數據庫連接對象數目。若應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費。

最大連接數:即數據庫連接池中能存放的最大連接數,若請求的連接數大於該數值,則超過的數據庫連接請求放入等待隊列等待。這會造成應用程序因不能立刻獲得數據庫連接而對程序產生功能性影響。

當請求連接時,小於最小連接數的請求將會立即得到,之後超過的連接請求需要爲他們建立一個新的數據庫連接。而這些新創建的數據庫連接在使用完畢之後不會被立即釋放,他們將會在連接池中等待重複使用或空閒超時之後被釋放。

原理流程:

程序初始化時創建一定數據量的數據庫連接對象存儲在內存中,當程序需要訪問數據庫時,並非建立一個新的連接,而是從連接池中取出一個已建立的空閒連接對象;如果連接池內沒有空閒連接,連接池創建新的數據庫連接對象並將這個連接對象提供給應用程序使用,應用程序用完後,數據庫連接池不會立刻關閉該連接,在空閒時間超過最大空閒時間時,該連接才被關閉; 如果數據庫連接請求超過最大連接數,則該數據庫連接請求被加入到等待隊列中;程序退出時,數據庫連接池斷開所有連接並釋放資源。

 

常用連接池

1、DBCP:DBCP(DataBase connection pool)數據庫連接池是apache上的一個 java連接池項目,也是 tomcat使用的連接池組件;單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar.dbcp沒有自動回收空閒連接的功能。

2、C3P0:C3P0是一個開源的jdbc連接池,它實現了數據源和jndi綁定,支持jdbc3規範和jdbc2的標準擴展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進程完成。擴展這些操作可以有效的提升性能。目前使用它的開源項目有Hibernate,Spring等。c3p0有自動回收空閒連接功能。注: JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標準的Java命名系統接口。

3、Druid:

Druid數據庫連接池是阿里巴巴開源平臺上的一個開源項目,該連接池性能高效,簡單SQL語句用時10微秒以內,複雜SQL用時30微秒。

4、HikariCP:

HikariCP數據庫連接池儘管是後起之秀,但卻PK掉其它數據庫連接池技術,成爲目前速度最快的數據庫連接池,SpringBoot2.0也已經採用HikariCP作爲默認連接池配置。

所以我們用HikariCP看一下如何配置連接池。

首先你需要HikariCP的架包這個在官網上很容易就可以得到。

之後在xml中代碼配置

<bean id= "dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" p:password="root" p:username="root" >
	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/testone"></property>
        <!-- 連接只讀數據庫時配置爲true, 保證安全 -->
	<property name="readOnly" value="false" /> 
	<!-- 等待連接池分配連接的最大時長(毫秒),超過這個時長還沒可用的連接則發生SQLException, 缺省:30秒 -->
	<property name="connectionTimeout" value="30000" /> 
	<!-- 一個連接idle狀態的最大時長(毫秒),超時則被釋放(retired),缺省:10分鐘 -->
	<property name="idleTimeout" value="600000" /> 
	<!-- 一個連接的生命時長(毫秒),超時而且沒被使用則被釋放(retired),缺省:30分鐘,建議設置比數據庫超時時長少30秒,參考MySQL wait_timeout參數(show variables like '%timeout%';) -->
	<property name="maxLifetime" value="1800000" /> 
	<!-- 連接池中允許的最大連接數。缺省值:10;推薦的公式:((core_count * 2) + effective_spindle_count) -->
	<property name="maximumPoolSize" value="15" />

</bean>

ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("application.xml");

System.out.println(application.getBean("dataSource"));

application.close();

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