SSM中使用Druid连接池
連接池
最原始的數據庫使用就是打開一個連接并進行使用,使用過后一定要關閉連接釋放資源。由于頻繁的打開和關閉連接對jvm包括數據庫都有一定的資源負荷,尤其應用壓力較大時資源占用比較多容易產生性能問題。由此使用連接池的作用就顯現出來,他的原理其實不復雜:
先打開一定數量的數據庫連接,當使用的時候分配給調用者,調用完畢后返回給連接池,注意返回給連接池后這些連接并不會關閉,而是
準備給下一個調用者進行分配。由此可以看出連接池節省了大量的數據庫連接打開和關閉的動作,對系統性能提升的益處不言而喻。
概念:
最小連接--應用啟動后隨即打開的連接數以及后續最小維持的連接數。
最大連接數--應用能夠使用的最多的連接數
連接增長數--應用每次新打開的連接個數
舉個例子說明連接池的運作:
假設設置了最小和最大的連接為10,20,那么應用一旦啟動則首先打開10個數據庫連接,但注意此時數據庫連接池的正在使用數字為0--因為你并沒有使用這些連接,而空閑的數量則是10。然后你開始登錄,假設登錄代碼使用了一個連接進行查詢,那么此時數據庫連接池的正在使用數字為1、空閑數為9,這并不需要從數據庫打開連接--因為連接池已經準備好了10個給你留著呢。登錄結束了,當前連接池的連接數量是多少?當然是0,因為那個連接隨著事務的結束已經返還給連接池了。然后同時有11個人在同一秒進行登錄,會發生什么:連接池從數據庫新申請(打開)了一個連接,連同另外的10個一并送出,這個瞬間連接池的使用數是11個,不過沒關系正常情況下過一會兒又會變成0。如果同時有21個人登錄呢?那第21個人就只能等前面的某個人登錄完畢后釋放連接給他。這時連接池開啟了20個數據庫連接--雖然很可能正在使用數量的已經降為0,那么20個連接會一直保持嗎?當然不,連接池會在一定時間內關閉一定量的連接還給數據庫,在這個例子里數字是20-10=10,因為只需要保持最小連接數就好了,而這個時間周期也是連接池里配置的。
Druid連接池
DRUID是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日志監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池。
Druid的DataSource類為com.alibaba.druid.pool.DruidDataSource
jar包下載
https://download.csdn.net/download/badao_liumang_qizhi/10864218
將jar包放在項目的lib下
Druid常用配置參數
| 配置 | 缺省值 | 說明 |
| name | ? | 配置這個屬性的意義在于,如果存在多個數據源,監控的時候可以通過名字來區分開來。? 如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this) |
| jdbcUrl | ? | 連接數據庫的url,不同數據庫不一樣。例如:? mysql : jdbc:mysql://10.20.153.104:3306/druid2? oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto |
| username | ? | 連接數據庫的用戶名 |
| password | ? | 連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter |
| driverClassName | 根據url自動識別 | 這一項可配可不配,如果不配置druid會根據url自動識別dbType,然后選擇相應的driverClassName(建議配置下) |
| initialSize | 0 | 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時 |
| maxActive | 8 | 最大連接池數量 |
| maxIdle | 8 | 已經不再使用,配置了也沒效果 |
| minIdle | ? | 最小連接池數量 |
| maxWait | ? | 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。 |
| poolPreparedStatements | false | 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。 |
| maxOpenPreparedStatements | -1 | 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100 |
| validationQuery | ? | 用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。 |
| testOnBorrow | true | 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。 |
| testOnReturn | false | 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能 |
| testWhileIdle | false | 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。 |
| timeBetweenEvictionRunsMillis | ? | 有兩個含義:? 1) Destroy線程會檢測連接的間隔時間2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明 |
| numTestsPerEvictionRun | ? | 不再使用,一個DruidDataSource只支持一個EvictionRun |
| minEvictableIdleTimeMillis | ? | ? |
| connectionInitSqls | ? | 物理連接初始化的時候執行的sql |
| exceptionSorter | 根據dbType自動識別 | 當數據庫拋出一些不可恢復的異常時,拋棄連接 |
| filters | ? | 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:? 監控統計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall |
| proxyFilters | ? | 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關系,并非替換關系 |
實現
SSM項目的搭建以及PageHelper分頁的實現參照
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/85115731
修改applicationContext.xml
注釋掉原來的datasource,新增Druid連接池。
<?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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:annotation-config /><context:component-scan base-package="com.badao.service" /><!-- ?<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">?<property name="driverClassName">?<value>com.mysql.jdbc.Driver</value>?</property>?<property name="url">?<value>jdbc:mysql://localhost:3306/ssmtest?characterEncoding=UTF-8</value>?</property>?<property name="username">?<value>root</value>?</property>?<property name="password">?<value>523627</value>?</property>? ?</bean> --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 基本屬性 url、user、password --><property name= "url"value="jdbc:mysql://localhost:3306/ssmtest?characterEncoding=UTF-8" /><property name="username" value="root" /><property name="password" value="523627" /><property name="driverClassName" value="com.mysql.jdbc.Driver" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="3" /><property name="minIdle" value="3" /><property name="maxActive" value="20" /><!-- 配置獲取連接等待超時的時間 --><property name="maxWait" value="60000" /><!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="SELECT 1" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打開PSCache,并且指定每個連接上PSCache的大小 --><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /></bean><bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="typeAliasesPackage" value="com.badao.pojo" /><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:com/badao/mapper/*.xml"/><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使用下面的方式配置參數,一行配置一個 --><value></value></property></bean></array></property>??</bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.badao.mapper"/></bean></beans>源碼下載
https://download.csdn.net/download/badao_liumang_qizhi/10864288
總結
以上是生活随笔為你收集整理的SSM中使用Druid连接池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSM中使用Mybatis的PageHe
- 下一篇: BootStrap中对input的typ