您好,登錄后才能下訂單哦!
Spring提供了兩個這樣的數(shù)據(jù)源(都位于org.springframework.jdbc.datasource程序包里):
DriverManagerDataSource:這個類實現(xiàn)了javax.sql.DataSource接口,但它并沒有提供池化連接的機制,每次調(diào)用getConnection()獲取新連接時,只是簡單地創(chuàng)建一個新的連接。因此,這個數(shù)據(jù)源類比較適合在單元測試 或簡單的獨立應(yīng)用中使用,因為它不需要額外的依賴類。
SingleConnectionDataSource:在每個連接請求時都返回同一個連接。雖然它不同嚴(yán)格意義上的池管理數(shù)據(jù)源,但我們可以把它看作只有一個連接的池。
對兩個數(shù)據(jù)源的配置都類似于配置DBCP的BasicDataSource,區(qū)別在于由于DriverManagerDataSource和SingleConnectionDataSource都沒有提供連接池,所以在此沒有設(shè)置池配置屬性。
雖然這兩個數(shù)據(jù)源都對于小程序來說是很不錯的,而且還在不斷發(fā)展,但把它們用于生產(chǎn)程序還是需要認(rèn)真考慮的。SingleConnectionDataSource只使用一個數(shù)據(jù)庫連接,所以不適合用于多線程程序。
而 DriverMangerDataSource雖然能夠支持多線程,但它會在每次連接請求時都新建一個連接,這是以性能為代價的。由于這些限制,我們強烈 建議應(yīng)該使用數(shù)據(jù)源池。
如果應(yīng)用配置在高性能的應(yīng)用服務(wù)器(如WebLogic或Websphere等)上,我們可能更希望使用應(yīng)用服務(wù)器本身提供的數(shù)據(jù)源。應(yīng)用服務(wù)器的數(shù)據(jù)源 使用JNDI開放調(diào)用者使用,Spring為此專門提供引用JNDI資源的JndiObjectFactoryBean類。
SSM框架之DriverManagerDataSource--spring-mybatis.xml
<!-- Spring提供了的數(shù)據(jù)源,每個連接請求時都新建一個連接 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${datasource.driverClassName}"></property>
<property name="url" value="${datasource.url}"></property>
<property name="username" value="${datasource.userName}"></property>
<property name="password" value="${datasource.userPassword}"></property>
</bean>
datasource.driverClassName=com.mysql.cj.jdbc.Driver
datasource.userName=root
datasource.userPassword=123456
datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
SSM框架之dbcp2連接池--spring-mybatis.xml(若是dbcp,個別參數(shù)對應(yīng)不上)
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${dbcp.driverClassName}" />
<property name="url" value="${dbcp.url}" />
<property name="username" value="${dbcp.username}" />
<property name="password" value="${dbcp.password}" />
<!--initialSize: 初始化連接 -->
<property name="initialSize" value="${dbcp.initialSize}" />
<!--maxIdle: 最大空閑連接 -->
<property name="maxIdle" value="${dbcp.maxIdle}" />
<!--minIdle: 最小空閑連接 -->
<property name="minIdle" value="${dbcp.minIdle}" />
<!--maxActive: 最大連接數(shù)量 -->
<property name="maxTotal" value="${dbcp.maxActive}" />
<!--removeAbandonedTimeout: 超時時間(以秒數(shù)為單位) -->
<property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}" />
<!--maxWait: 超時等待時間以毫秒為單位 6000毫秒/1000等于60秒 -->
<property name="maxWaitMillis" value="${dbcp.maxWait}" />
<!-- 在空閑連接回收器執(zhí)行周期(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" />
<!-- 在每次空閑連接回收器線程(如果有)運行時檢查的連接數(shù)量 -->
<property name="numTestsPerEvictionRun" value="${dbcp.numTestsPerEvictionRun}" />
<!-- 最小空閑時間 -->
<property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" />
<!-- 驗證鏈接是否有效的sql語句 -->
<property name="validationQuery" value="${dbcp.validationQuery}" />
<!-- 獲取鏈接之前是否測試鏈接的可用性 -->
<property name="testOnBorrow" value="${dbcp.testOnBorrow}" />
</bean>
#src/config/dbcp.properties
dbcp.driverClassName=com.mysql.cj.jdbc.Driver
dbcp.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
dbcp.username=root
dbcp.password=123456
dbcp.initialSize=3
dbcp.minIdle=5
dbcp.maxIdle=10
dbcp.maxActive=15
dbcp.maxWait=60000
dbcp.numTestsPerEvictionRun=10
dbcp.timeBetweenEvictionRunsMillis=60000
dbcp.minEvictableIdleTimeMillis=300000
dbcp.validationQuery=SELECT 1
dbcp.testOnBorrow=false
dbcp.removeAbandoned=true
dbcp.removeAbandonedTimeout=1800
SSM框架之c3p0連接池--spring-mybatis.xml
<!-- c3p0連接池配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${c3p0.driverClassName}"/>
<property name="jdbcUrl" value="${c3p0.jdbcUrl}"/>
<property name="user" value="${c3p0.user}"/>
<property name="password" value="${c3p0.password}"/>
<!--當(dāng)連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù)。Default: 3 -->
<property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
<!--初始化時獲取三個連接,取值應(yīng)在minPoolSize與maxPoolSize之間。Default: 3 -->
<property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
<!--最大空閑時間,60秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default: 0 -->
<property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
<!--每60秒檢查所有連接池中的空閑連接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
<!-- JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements 屬于單個connection而不是整個連接池。
所以設(shè)置這個參數(shù)需要考慮到多方面的因素。 如果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default: 0 -->
<property name="maxStatements" value="${c3p0.maxStatements}"/>
<!-- c3p0是異步操作的,緩慢的JDBC操作通過幫助進(jìn)程完成。擴展這些操作可以有效的提升性能 通過 多線程實現(xiàn)多個操作同時被執(zhí)行。Default: 3 -->
<property name="numHelperThreads" value="${c3p0.numHelperThreads}"/>
</bean>
#src/config/c3p0.properties
c3p0.driverClassName=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
c3p0.user=root
c3p0.password=123456
c3p0.acquireIncrement=3
c3p0.initialPoolSize=3
c3p0.idleConnectionTestPeriod=60
c3p0.minPoolSize=5
c3p0.maxPoolSize=100
c3p0.maxStatements=100
c3p0.numHelperThreads=10
c3p0.maxIdleTime=60
SSM框架之Druid連接池--spring-mybatis.xml
<!-- druid連接池配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 數(shù)據(jù)庫基本信息配置 -->
<property name="driverClassName" value="${druid.driverClassName}"></property>
<property name="url" value="${druid.url}"></property>
<property name="username" value="${druid.userName}"></property>
<property name="password" value="${druid.userPassword}"></property>
<!-- 初始化連接數(shù)量 -->
<property name="initialSize" value="${druid.initialSize}" />
<!-- 最大并發(fā)連接數(shù) -->
<property name="maxActive" value="${druid.maxActive}" />
<!-- 最小空閑連接數(shù) -->
<property name="minIdle" value="${druid.minIdle}" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="${druid.maxWait}" />
<!-- 配置間隔多久才進(jìn)行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
<!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
<!-- 要啟用PSCache,必須配置大于0,當(dāng)大于0時,poolPreparedStatements自動觸發(fā)修改為true -->
<property name="maxPoolPreparedStatementPerConnectionSize"
value="${druid.maxOpenPreparedStatements}" />
<!-- 用來檢測連接是否的sql,要求是一個查詢語句。在mysql中通常設(shè)置為SELECT 'X' -->
<property name="validationQuery" value="${druid.validationQuery}" />
<!-- 申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery連接是否有效 -->
<property name="testWhileIdle" value="${druid.testWhileIdle}" />
<!-- 申請連接時執(zhí)行validationQuery檢測連接是否有效 這個配置會降低性能 -->
<property name="testOnBorrow" value="${druid.testOnBorrow}" />
<!-- 歸還連接時執(zhí)行validationQuery檢測連接是否有效 這個配置會降低性能 -->
<property name="testOnReturn" value="${druid.testOnReturn}" />
<!-- 超過時間限制是否回收: 打開removeAbandoned功能 -->
<property name="removeAbandoned" value="${druid.removeAbandoned}" />
<!-- 超時時間:1800秒,也就是30分鐘 -->
<property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
<!-- 關(guān)閉abanded連接時輸出錯誤日志 -->
<property name="logAbandoned" value="${druid.logAbandoned}" />
<!-- 監(jiān)控統(tǒng)計攔截的filters stat是statfilter的別名,log4j是logFilter的別名 -->
<property name="filters" value="${druid.filters}" />
<property name="proxyFilters">
<list>
<ref bean="stat-filter" />
<ref bean="log-filter" />
</list>
</property>
</bean>
<!-- 慢SQL記錄 -->
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<!-- 開啟合并sql -->
<property name="mergeSql" value="true" />
<!-- 用來配置SQL慢的標(biāo)準(zhǔn),執(zhí)行時間超過slowSqlMillis的就是慢。slowSqlMillis的缺省值為3000,也就是3秒。 -->
<property name="slowSqlMillis" value="1000" />
<property name="logSlowSql" value="true" />
</bean>
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
<!-- <property name="resultSetLogEnabled" value="false" /> -->
<!-- <property name="statementExecutableSqlLogEnable" value="true" /> -->
</bean>
#src/config/druid.properties
druid.driverClassName=com.mysql.cj.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
druid.userName=root
druid.userPassword=123456
druid.initialSize=0
druid.maxActive=20
druid.minIdle=1
druid.maxIdle=20
druid.maxWait=60000
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.poolPreparedStatements=true
druid.maxOpenPreparedStatements=20
druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.removeAbandoned=true
druid.removeAbandonedTimeout=1800
druid.logAbandoned=true
druid.filters=stat,log4j
在web.xml添加如下內(nèi)容
<!-- druid連接池監(jiān)控過濾器 -->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name> <!-- 經(jīng)常需要排除一些不必要的url -->
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 這個StatViewServlet的用途包括:提供監(jiān)控信息展示的html頁面;提供監(jiān)控信息的JSON API -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<!-- 白名單 -->
<!-- <init-param>
如果是限定指定的子網(wǎng)里的所有ip都可以訪問,那就是ip/子網(wǎng)掩碼數(shù)。例如 192.168.1.120/24 就相當(dāng)于192.168.1.*
<param-name>allow</param-name>
<param-value>127.0.0.1</param-value>
</init-param> -->
<!-- 如果不配置用戶名密碼,就是任何人都可以訪問了-->
<init-param>
<!-- 用戶名 -->
<param-name>loginUsername</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<!-- 密碼 -->
<param-name>loginPassword</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
輸入用戶名root、密碼root即可登錄
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。