最近使用这类连接池发现有问题,当链接一个数据库如果数据库端异常或重启,就会出现提示链接数据库异常的信息。
貌似是这个连接池一直是拿着原来的链接去访问数据库的。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<pre name="code" class="html"> <property <span style="color:#008000;">name</span>="driverClassName" value="XXXXXX" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/XXX" />
<property name="username" value="root" />
<property name="password" value="root" />
这就是我之前的一些配置,简单配置以上属性,就可以访问数据库了,但是当数据库端或者链接出现异常的时候会存在问题。
好在这两个连接池本身提供一些附加属性来解决。下面就看下各个属性的作用吧:
接下来就是我改后的配置,当数据库端异常导致原链接不可用的情况,连接池会自动探测当前链接是否可用
!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<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 * from table" />//检测时候用到的语句,随便写一条即可
<!--是否要进行检测-->
<property name="testWhileIdle" value="true" />
<!--是否在数据库连接请求量大的时候,如总数50,当前已请求了49个,所剩不多了,检测那些执行时间久的连接-->
<property name="removeAbandoned" value="true"/>
<!--每次检测时,需要检测多少个数据连接,一般设置为与最大连接数一样,这样就可以检测完所有的连接-->
<property name="numTestsPerEvictionRun" value="20"/>
<!--申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,保险起见还是检测吧-->
<property name="testOnBorrow" value="true" />
<!--归还连接时执行validationQuery检测连接是否有效-->
<property name="testOnReturn" value="true" />
ok这样就好了。
记录下其他的属性功能吧。
配置 | 缺省值 | 说明 |
name |
| 配置这个属性的意义在于,如果存在多个数据源,监控的时候 |
jdbcUrl |
| 连接数据库的url,不同数据库不一样。例如: |
username |
| 连接数据库的用户名 |
password |
| 连接数据库的密码。如果你不希望密码直接写在配置文件中, |
driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType, |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法, |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle |
| 最小连接池数量 |
maxWait |
| 获取连接时最大等待时间,单位毫秒。配置了maxWait之后, |
poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。 |
maxOpenPreparedStatements | -1 | 要启用PSCache,必须配置大于0,当大于0时, |
validationQuery |
| 用来检测连接是否有效的sql,要求是一个查询语句。 |
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效, |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效, |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。 |
timeBetweenEvictionRunsMillis |
| 有两个含义: |
numTestsPerEvictionRun |
| 不再使用,一个DruidDataSource只支持一个EvictionRun |
minEvictableIdleTimeMillis |
|
|
connectionInitSqls |
| 物理连接初始化的时候执行的sql |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters |
| 属性类型是字符串,通过别名的方式配置扩展插件, |
proxyFilters |
| 类型是List<com.alibaba.druid.filter.Filter>, |