一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談在Spring中如何使用數據源(DBCP、C3P0、JNDI)

淺談在Spring中如何使用數據源(DBCP、C3P0、JNDI)

2021-06-09 13:53deniro Java教程

這篇文章主要介紹了淺談在Spring中如何使用數據源(DBCP、C3P0、JNDI),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在 spring 中,有以下三種方式來創建數據源:

  • 通過 jndi 獲取應用服務器中的數據源;
  • 在 spring 容器中配置數據源;
  • 通過代碼來創建數據源,這種方式適用于無容器依賴的單元測試。

1 配置數據源

spring 在第三方依賴包中包含了 2 種數據源的實現包 一個是 apache 的 dbcp;另一個是 c3p0。 我們可以在 spring 配置文件中直接配置這些數據源 。

1.1 dbcp

dbcp (database connection pool)是一個依賴 jakarta commons-pool 對象池機制的數據庫連接池,所以在類路徑下還必須包括 commons-pool.jar。 下面是使用 dbcp 配置 mysql 數據源的配置片段:

?
1
2
3
4
5
6
<bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close">   
  <property name="driverclassname" value="com.mysql.jdbc.driver" />   
  <property name="url" value="jdbc:mysql://localhost:3309/db" />   
  <property name="username" value="root" />   
  <property name="password" value="xxxxxx" />   
</bean> 

basicdatasource 提供了 close() 方法用于關閉數據源,所以必須設定 destroy-method=”close”, 以便 spring 容器關閉時,能夠正常關閉數據源。

除以上必須的數據源屬性外,還有一些常用的屬性。

事務屬性:

 

屬性 默認值 說明
defaultautocommit true 連接默認為 auto-commit 狀態。
defaultreadonly 驅動默認值 連接默認的 read-only 狀態 。如果沒有設置則 setreadonly 方法將不會被調用。( 某些驅動不支持只讀模式 , 比如:informix)
defaulttransactionisolation 驅動默認值 連接默認的 transactionisolation 狀態。有這些值:none、read_committed、read_uncommitted、repeatable_read、serializable。

 

連接數相關屬性:

 

屬性 默認值 說明
initialsize 0 初始化連接數:連接池啟動時創建的初始化連接數量。
maxactive 8 最大活動連接 : 連接池在同一時間內能夠分配的最大活動連接的數量。如果設置為非正數,則表示不限制。
maxidle 8 最大空閑連接 : 連接池中容許保持空閑狀態的最大連接數量 , 超過的空閑連接將被釋放 , 如果設置為負數,則表示不限制。
minidle 0 最小空閑連接 : 連接池中容許保持空閑狀態的最小連接數量 , 低于這個數量將創建新的連接 , 如果設置為 0,則表示不創建。
maxwait 無限 最大等待時間 : 當沒有可用連接時 , 連接池等待連接被歸還的最大時間 ( 單位為毫秒 ) , 超出時間將拋出異常 , 如果設置為 -1,則表示無限等待。

 

連接監測與維護相關屬性:

 

屬性 默認值 說明
validationquery 配置 sql 查詢語句 , 用于驗證從連接池取出的連接是否可用。如果指定 , 則查詢必須是一個 sql select,并且必須返回至少一行記錄。mysql 中是 “select 1”;在 oracle 中是 "select 1 from dual"。
testonborrow true 指明是否從連接池中取出連接之前進行檢測 , 如果檢測失敗 , 則從池中去除連接并嘗試取出另一個新的連接。 注意 : 設置為 true 后如果要生效,則 validationquery 參數必須正確被設置。
testonreturn false 指明是否在歸還到池中前進行檢測。 注意 : 與 testonborrow 一樣,設置為 true 后如果要生效,則 validationquery 參數必須正確被設置。
testwhileidle false 指明連接是否會被空閑連接回收器 ( 如果有 ) 所檢測。 如果檢測失敗 , 則連接將從池中被移除。 注意 : 設置為 true 后如果要生效,則 validationquery 參數必須正確被設置。
timebetweenevictionrunsmillis -1 空閑連接回收器線程運行的周期 , 以毫秒為單位。如果設置為非正數 , 則不運行空閑連接回收器線程。 注意 : 啟用該參數時,則 validationquery 參數必須正確被設置。
numtestsperevictionrun 3 在每次空閑連接回收器線程 ( 如果有 ) 運行時需要檢測的連接數量。
minevictableidletimemillis 1000 * 60 * 30 連接在池中保持空閑而不被空閑連接回收器線程回收的最小時間值,以毫秒為單位。

 

緩存相關屬性:

 

屬性 默認值 說明
poolpreparedstatements false 開啟連接池的 prepared statement 功能設置為 true 后,所有的 callablestatement 和 preparedstatement 都會被緩存起來。
maxopenpreparedstatements 不限制 能夠同時分配打開的 statements 的最大數量。0 表示不限制。

 

連接泄露回收相關屬性:

 

屬性 默認值 說明
removeabandoned false 是否刪除泄露的連接。如果設置為 true, 那么那些可能存在泄露的連接會被刪除。假設 maxactive 為 10 個,活動連接為 8 個,空閑連接為 1 個,10-8-1=1,那么就會把刪除這個連接(會先檢測該活動連接未被使用的時間是否超過 removeabandonedtimeout)。如果需要一個長連接操作,那么 removeabandoned 需要設置的長一些,否則正常使用的連接可能會被誤刪除。
removeabandonedtimeout 300 泄露的連接可以被刪除的時間段,單位為秒。
logabandoned false 當 statement 或連接被泄露時是否打印堆棧日志 。

 

假設數據庫用的是 mysql,那么如果數據源配置不當,將可能會發生經典的 “8 小時問題 ”。 原因是 mysql 在默認情況下如果發現一個連接的空閑時間超過 8 小時,那么會在數據庫端自動關閉這個連接 。 而數據源并不知道這個連接已經被關閉了,所以當它將這個無用的連接返回給某個 dao 時, dao 就會拋出無法獲取 connection 的異常 。

dbcp 的 testonborrow 默認設置為 true,所以從連接池中取出連接之前會先進行檢測,因為不會發生 “8 小時問題 ”。 但如果每次取連接時都進行檢測,那么在高并發應用下就會產生性能問題。

因此建議在高并發下,將 testonborrow 設置為 false;然后將 testwhileidle 設置為 true,打開空閑連接回收器;最后把 timebetweenevictionrunsmillis 的值設定為小于 8 小時,這樣那些被 mysql 所關閉的空閑連接,就會被清除出去。這樣不僅解決了 “8 小時問題 ”,而且還保證了高性能 o(∩_∩)o哈哈~

注意:因為 mysql 本身的 interactive-timeout(單位為 s)參數,可以設定空閑連接的過期時間,所以我們要想獲取到這個參數值,然后再設定 dbcp 的 timebetweenevictionrunsmillis 屬性值。

1.2 c3p0

c3p0 是一個開放源代碼的 jdbc 數據源實現項目,它實現了 jdbc3 和 jdbc2 擴展規范說明的 connection 和 statement 池。

下面是使用 c3p0 配置 mysql 數據源的配置片段:

?
1
2
3
4
5
6
<bean id="datasource" class="com.mchange.v2.c3p0.combopooleddatasource" destroy-method="close">   
  <property name="driverclass" value="oracle.jdbc.driver.oracledriver" />   
  <property name="jdbcurl" value="jdbc:mysql://localhost:3309/db" />   
  <property name="use" value="xxx" />   
  <property name="password" value="xxxxxx" />   
</bean> 

c3p0 也提供了一個用于關閉數據源的 close() 方法,這樣我們就可以保證 spring 容器被關閉時,能夠成功關閉數據源 。

 

屬性 默認值 說明
acquireincrement   當連接池中無空閑連接時, 一次性創建新連接的數量。
acquireretryattempts 30 在從數據庫獲取新連接失敗后,重復嘗試的次數。
acquireretrydelay 1000 嘗試獲取連接之間的間隔時間,單位為毫秒。
autocommitonclose false 連接關閉時,將所有未提交的操作回滾 。
automatictesttable null 會創建一張名為 test 的空表,并使用其自帶的查詢語句進行測試 。 如果定義了這個參數,那么 preferredtestquery 屬性 將被忽略 。 我們不能在這張 test 表上進行任何操作,它僅為 c3p0 測試所用。
breakafteracquirefailure false 獲取連接失敗時,將會引起所有等待獲取連接的線程拋出異常 。 但是數據源仍有效保留,并在下次調用 getconnection() 時繼續嘗試獲取連接 。 在嘗試獲取連接失敗后,該數據源將申明已斷開并永久關閉。
checkouttimeout 0 當連接池中的連接用完時,客戶端調用 getconnection() 后等待獲取新連接的時間,單位:毫秒。超時后將拋出 sqlexception 。設為 0 表示無限期等待 。
connectiontesterclassname com.mchange.v2.c3p0.impl.defaultconnectiontester 通過實現 connectiontester 或 queryconnectiontester 的類來測試連接,類名需設置為全限定名 。
idleconnectiontestperiod 0 隔多少秒,檢查連接池中的所有空閑連接。0 表示不檢查。
initialpoolsize 3 初始化時創建的連接數,應在 minpoolsize 與 maxpoolsize 之間取值 。
maxidletime 0 最大空閑時間,超過空閑時間的連接將會被丟棄 。 為 0 或負數則表示永不丟棄 。
maxpoolsize 15 連接池中保留的最大連接數 。
maxstatements 0 jdbc 標準參數,用以控制數據源內加載的 preparedstatement 數量 。 但由于預緩存的 statement 屬于單個 connection 而不是整個連接池 。 所以設置這個參數需要多方面的考慮,如果 maxstatements 與 maxstatementsperconnection 均為 0 ,則緩存被關閉 。
maxstatementsperconnection 0 連接池內單個連接所擁有的最大緩存 statement 數 。
numhelperthreads 3 c3p0 是異步操作的,緩慢的 jdbc 操作通過 helperthreads 完成 。 通過多線程實現多個操作同時被執行,這樣可以有效地提升性能。
preferredtestquery null 定義所有連接測試都執行的測試語句。在使用連接測試的情況下,這個參數能夠顯著地提高測試速度。測試的表必須在初始數據源時就存在。
propertycycle 300 修改系統配置參數生效時長,單位為 s。
testconnectiononcheckout false 因性能消耗大,所以請只在需要時開啟 。 如果設為 true 那么在每個 connection 提交的時候都將校驗其有效性 。 建議使用 idleconnectiontestperiod 或 automatictesttable 等方法來提升連接測試的性能 。
testconnectiononcheckin false 如果設為 true,那么在取得連接的同時將校驗其連接的有效性。

 

2 jndi 數據源

如果應用配置在高性能的應用服務器(如 weblogic 或 websphere 等)上,我們可能更希望使用應用服務器所提供的數據源 。 應用服務器的數據源使用 jndi 方式來供調用者使用, spring 為此專門提供了引用 jndi 資源的 jndiobjectfactorybean 類 。 下面是一個簡單的配置:

?
1
2
<bean id="datasource" class="org.springframework.jndi.jndiobjectfactorybean"
   p:jndiname="java:comp/env/jdbc/ds"/>

spring2.0+ 為獲取 j2ee 資源提供了一個 jee 命名空間,通過 jee 命名空間,可以有效地簡化 j2ee 資源的引用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
   http://www.springframework.org/schema/jee
   http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
   ">
 
  <jee:jndi-lookup id="datasource" jndi-name="java:comp/env/jdbc/ds"/>
 
</beans>

3 spring 數據源實現類

spring 本身也提供了一個簡單的數據源實現類 drivermanagerdatasource ,它位于 org.springframework.jdbc.datasource 包中 。 這個類實現了 javax.sql.datasource 接口,但它并沒有提供池化連接機制,每次調用 getconnection() 方法獲取新連接時,只是簡單地創建一個新的連接 。它不需要額外的依賴類,所以,這個數據源類比較適合在單元測試中使用 。

spring 數據源實現類既可以通過配置直接使用,也可以在代碼中實例化調用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
drivermanagerdatasource datasource=new drivermanagerdatasource();
datasource.setdriverclassname("com.mysql.jdbc.driver");
datasource.seturl("jdbc:mysql://127.0.0.1:3306/spring4");
datasource.setusername("root");
datasource.setpassword("");
 
try {
  connection connection=datasource.getconnection();
  if(connection.isclosed()){
    system.out.println("連接已關閉");
  }else{
    system.out.println("連接已開啟");
  }
} catch (sqlexception e) {
  e.printstacktrace();
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/d23f1d418fe6

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2021国产麻豆剧传媒剧情最新 | 麻麻与子乱肉小说怀孕 | 天天爽视频 | 久久青青草原精品国产软件 | 久久久无码精品亚洲A片猫咪 | 国产情侣露脸自拍 | 大象视频污 | 国产99在线a视频 | 男人操男人 | 99精品视频免费在线观看 | 暖暖在线日本 | 微拍秒拍99福利精品小视频 | 亚洲一区二区三区深夜天堂 | 短篇最污的乱淫伦小说全集 | 国产农村乱子伦精品视频 | 亚洲天堂2013| 免费理伦片在线观看全网站 | 射逼网| 国产午夜精品久久久久小说 | zoofilivideo杂交3d| 日韩亚洲国产激情在线观看 | jj视频免费看| 美女脱小内内给男生摸j | 亚洲 欧美 清纯 校园 另类 | 激情六月丁香婷婷四房播 | 久久精麻豆亚洲AV国产品 | 国产一级在线免费观看 | 大团圆免费阅读全文 | 久久综合狠狠综合久久综合88 | 日韩高清在线免费观看 | 本土自拍| 国产第一福利视频导航在线 | 秀婷程仪公欲息肉婷在线观看 | 欧美精品v欧洲高清 | 短篇最污的乱淫伦小说全集 | 成人看的羞羞视频免费观看 | 毛片网站观看 | 亚洲国产婷婷俺也色综合 | 大学生按摩黄a级中文片 | 国产美女做爰免费视频软件 | yjsp妖精视频在线观看免费 |