Ⅰ spring連接池配置詳解
資料庫連接池概述
資料庫連接是一種關鍵的有限的昂貴的資源 這一點在多用戶的網頁應用程序中體現得尤為突出 對資料庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性 影響到程序的性能指標 資料庫連接池正是針對這個問題提出來的
資料庫連接池負責分配 管理和釋放資料庫或碰毀連接 它允許應用程序重復使用一個現有的資料庫連接 而再不是重新建立一個 釋放空閑時間超過最大空閑時間的資料庫連吵返接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏 這項技術能明顯提高對資料庫操作的性能
資料庫連接池在初始化時將創建一定數量的資料庫連接放到連接池中 這些資料庫連接的數量是由最小資料庫連接數來設定的 無論這些資料庫連接是否被使用 連接池都將一直保證至少擁有這么多的連接數量 連接池的最大數據庫連接數量限定了這個連接池能佔有的最大連接數 當應用程序向連接池請求的連接數超過最大連接數量時 這些請求將被加入到等待隊列中 資料庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素
) 最小連接數是連接池一直保持的資料庫連接 所以如果應用程序對資料庫連接的使用量不大 將會有大量的資料庫連接資源被浪費
) 最大連接數是連接池能申請的最大連接數 如果資料庫連接請求超過此數 後面的資料庫連接請求將被加入到等待隊列中 這會影響之後的資料庫操作
) 如果最小連接數與最大連接數相差太大 那麼最先的連接請求將會獲利 之後超過最小連接數量的連接請求等價於建立一個新的資料庫連接 不過 這些大於最小連接數的資料庫連接在使用完不會馬上被釋放 它將被放到連接池中等待重復使用或是空閑超時後被釋放
目前常用的連接池有 C P DBCP Proxool
網上的評價是
C P 比較耗費資源 效率方面可能要低一點
DBCP在實踐中存在BUG 在某些種情會產生很多空連接不能釋放 Hibernate 已經放棄了對其的支持
Proxool的負面評價較少 現在比較推薦它 而且它還提供即時監控連接池狀態的功能 便於發現連接泄漏的情況
配置如下
在spring配置文件中 一般在applicationContext xml中
<bean id= DataSource class= logicalcobwebs proxool ProxoolDataSource destroy method= shutdown >
<衫備property name= driver >
<value>oracle jdbc driver OracleDriver</value>
</property>
<property name= driverUrl >
<value>jdbc:oracle:thin:xxxx/xxxx@ XX: :server</value>
</property>
<property name= user >
<value>xxxx</value>
</property>
<property name= password >
<value>xxxx</value>
</property>
<property name= alias >
<value>server</value>
</property>
<property name= houseKeepingSleepTime >
<value> </value>
</property>
<property name= houseKeepingTestSql >
<value>select from al</value>
</property>
<property name= testBeforeUse >
<value>true</value>
</property>
<property name= testAfterUse >
<value>true</value>
</property>
<property name= prototypeCount >
<value> </value>
</property>
<property name= maximumConnectionCount >
<value> </value>
</property>
<property name= minimumConnectionCount >
<value> </value>
</property>
<property name= statistics >
<value> m m d</value>
</property>
<property name= statisticsLogLevel >
<value>ERROR</value>
</property>
<property name= trace >
<value>true</value>
</property>
<property name= verbose >
<value>false</value>
</property>
<property name= simultaneousBuildThrottle >
<value> </value>
</property>
<property name= maximumActiveTime >
<value> </value>
</property>
<property name= jmx >
<value>false</value>
</property>
</bean>
然後注入到sessionFactory中
<bean id= sessionFactory class= springframework orm hibernate LocalSessionFactoryBean >
<property name= dataSource ref= DataSource />
</bean>
屬性列表說明:
fatal sql exception: 它是一個逗號分割的信息片段 當一個SQL異常發生時 他的異常信息將與這個信息片段進行比較 如果在片段中存在 那麼這個異常將被認為是個致命錯誤(Fatal SQL Exception ) 這種情況下 資料庫連接將要被放棄 無論發生什麼 這個異常將會被重擲以提供給消費者 用戶最好自己配置一個不同的異常來拋出
fatal sql exception wrapper class:正如上面所說 你最好配置一個不同的異常來重擲 利用這個屬性 用戶可以包裝SQLException 使他變成另外一個異常 這個異常或者繼承QLException或者繼承字RuntimeException proxool自帶了 個實現: logicalcobwebs proxool FatalSQLException 和 logicalcobwebs proxool FatalRuntimeException 後者更合適
house keeping sleep time: house keeper 保留線程處於睡眠狀態的最長時間 house keeper 的職責就是檢查各個連接的狀態 並判斷是否需要銷毀或者創建
house keeping test sql: 如果發現了空閑的資料庫連接 house keeper 將會用這個語句來測試 這個語句最好非常快的被執行 如果沒有定義 測試過程將會被忽略
injectable connection interface: 允許proxool實現被代理的connection對象的方法
injectable statement interface: 允許proxool實現被代理的Statement 對象方法
injectable prepared statement interface: 允許proxool實現被代理的PreparedStatement 對象方法
injectable callable statement interface: 允許proxool實現被代理的CallableStatement 對象方法
jmx: 如果屬性為true 就會注冊一個消息Bean到jms服務 消息Bean對象名: Proxool:type=Pool name=<alias> 默認值為false
jmx agent id: 一個逗號分隔的JMX代理列表(如使用MBeanServerFactory findMBeanServer(String agentId)注冊的連接池 )這個屬性是僅當 jmx 屬性設置為 true 才有效 所有注冊jmx伺服器使用這個屬性是不確定的
jndi name: 數據源的名稱
maximum active time: 如果housekeeper 檢測到某個線程的活動時間大於這個數值 它將會殺掉這個線程 所以確認一下你的伺服器的帶寬 然後定一個合適的值 默認是 分鍾
maximum connection count: 最大的資料庫連接數
maximum connection lifetime: 一個線程的最大壽命
minimum connection count: 最小的資料庫連接數
overload without refusal lifetime: 這可以幫助我們確定連接池的狀態 如果我們已經拒絕了一個連接在這個設定值(毫秒) 然後被認為是超載 默認為 秒
prototype count: 連接池中可用的連接數量 如果當前的連接池中的連接少於這個數值 新的連接將被建立(假設沒有超過最大可用數) 例如 我們有 個活動連接 個可用連接 而我們的prototype count是 那麼資料庫連接池將試圖建立另外 個連接 這和 minimum connection count不同 minimum connection count把活動的連接也計算在內 prototype count 是spare connections 的數量
recently started threshold: 這可以幫助我們確定連接池的狀態 連接數少還是多或超載 只要至少有一個連接已開始在此值(毫秒)內 或者有一些多餘的可用連接 那麼我們假設連接池是開啟的 默認為 秒
simultaneous build throttle: 這是我們可一次建立的最大連接數 那就是新增的連接請求 但還沒有可供使用的連接 由於連接可以使用多線程 在有限的時間之間建立聯系從而帶來可用連接 但是我們需要通過一些方式確認一些線程並不是立即響應連接請求的 默認是
statistics: 連接池使用狀況統計 參數 s m d
statistics log level: 日誌統計跟蹤類型 參數 ERROR 或 INFO
test before use: 如果為true 在每個連接被測試前都會服務這個連接 如果一個連接失敗 那麼將被丟棄 另一個連接將會被處理 如果所有連接都失敗 一個新的連接將會被建立 否則將會拋出一個SQLException異常
test after use: 如果為true 在每個連接被測試後都會服務這個連接 使其回到連接池中 如果連接失敗 那麼將被廢棄
trace: 如果為true 那麼每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL) 你也可以注冊一個ConnectionListener (參看ProxoolFacade)得到這些信息
lishixin/Article/program/Java/ky/201311/28572
Ⅱ 平時在spring框架中如何使用多線程
Spring aop 依賴注入的就是單例對象,我們在使用的時候如果有多個相同處理回且不怎麼耗時的答情況下一般會採用for循環直接執行,這樣的情況下即使有事務管理也不會影響業務執行下去;但是,大多數的應用比如:系統與系統之間的交互就比較耗時了,此時使用for循環執行業務就不可取了,於是我們想用線程來解決這個問題。
另外,附帶說明一下:如果是在Spring提供的@Test下測試:如果有多線程處理,需要調用Thread.sleep(3000);實現線程等待,這也是測試多線程模式下所必須的。如果不加線程休眠,不等待多線程執行完畢,很有可能測不出來多線程調用的處理。