在Spring的配置文件applicationContext-mybatis.xml中配置数据源对象
<context:property-placeholder location="classpath:database.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
<property name="initialSize" value="${initialSize}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="minIdle" value="${minIdle}"/>
<property name="maxWait" value="${maxWait}"/>
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<property name="removeAbandoned" value="${removeAbandoned}"/>
<property name= "testWhileIdle" value="true"/>
<property name= "testOnBorrow" value="false"/>
<property name= "testOnReturn" value="false"/>
<property name= "validationQuery" value="select 1"/>
<property name= "timeBetweenEvictionRunsMillis" value="60000"/>
<property name= "numTestsPerEvictionRun" value="${maxActive}"/>
</bean>
- initalSize:数据库连接池在初始化连接时,第一次就要创建的连接个数,默认为0。
- maxActive:定义连接池中同时连接的最大连接数,默认连接为8。若设置为50,则表示可以支持单机并发50左右的处理能力。
- maxIdle:定义连接池中可允许的最大空闲连接数,默认连接为8。超过设置的空闲连接数将被释放掉,若设置为负数则表示不受限制。
- minIdle:定义连接池中最小连接数,默认连接数为0。低于该数值的连接池将会创建新的连接。
注意:maxIdle不能设置太小,因为在高负载的情况下,连接的打开时间比关闭时间要快,会引起连接池中空闲连接个数上升并超过最大的空闲数,从而造成连接频繁的销毁和创建,导致性能下降,所以具体设置要根据业务量来定义。
minIdle一般情况下设置的数值越接近maxIdle,系统性能越好,因为连接的创建和销毁都需要消耗系统资源。这个值也不能设置得太大,否则服务器在很空闲的时候,会创建minIdle个数的连接。
- maxWait:定义最大等待连接时间,单位为ms。即当连接池中没有可用连接时。连接池需要等待的连接释放的最大时间。若等待时间超过这个设置时间,则会抛出异常,若该值设置为-1,则表示无限等待下去。该默认值为无限等待。配置该数值可以避免因线程池不够而导致的请求被无限挂起和连接不可用问题。
- removeAbandoned:定义该配置项的作用是告诉连接池是否开启无用连接回收的机制,默认为false,这里调整为true。
- removeAbandonedTimeout:当开启了无用连接池回收的机制之后,配置该配置项,可以控制连接池在超出配置的时间后回收没有用的连接,这个配置默认值为300秒,建议稍微少一点,尽量快速的回收没有用的连接。
- testWhileIdle:定义开启Evict的定时校验循环校验)
- testBetweenEvictionRunsMillis:定义Evict时间间隔,单位为毫秒,此处设值为6000,即1分钟,这个值大于0才会开启Evict。
- testOnBorrow:定义在进行brrowObject处理是,对拿到的连接是否进行校验,false为不校验,默认为false。
- testOnReturn:定义在returnObject时,对返回的连接是否进行校验,false为不校验,默认为false。
- validationQuery:定义校验使用的SQL语句,跟MySQL简单通信下,校验连接是否有效。注意:该SQL语句不能太复杂,复杂的校验SQL会严重影响性能。
- numTestsPerEvictionRun:定义每次校验连接的数量。一般情况下,该值会和maxActive大小一样,每次可以校验所有的连接。
注意: 配置SQL心跳指在校验连接的同时,解决数据库重新连接的问题,从而确保连接池中的连接是真实有效的。举例说明:
当系统现在在正常运行,此时若由于某种原因,需将数据库停掉(或者突发情况下,数据库服务器直接宕机),那么此时连接池的所有连接都已经无效,整个系统功能将不可用。
需要对数据库服务器和应用服务器进行重启操作,才能正常访问应用系统,使用系统功能。所以当有了SQL心跳包的配置后,当数据库重启后系统不用重启。
另外,由于MySQL数据库默认有8个小时的时间内没有连接动态(即没有请求数据),MySQL会主动断掉所有的连接,此时应用系统是不可用的,若想恢复必须重启应用程序,重新建立连接,让它主动去请求MySQL。
上述的testWhileIdle、testOnBorrow、testOnReturn是连接池提供的几种校验机制,通过外部钩子的方式回调。dbcp连接池使用validationQuery来定义数据库连接校验查询,此处使用”select 1”简单的校验SQL来校验连接池。
整个校验的过程:当开启了whileIdle校验后,相当于打开了一个回收(Evict:依法回收)的计时器,会通过定时器的时间不停地去校验,定时对连接进行校验。对无效的连接进行关闭后,适当建立连接,保证最小的minIdle的连接数。既然开启了定时,就需要定义时间轮询,那么testBetweenEvictionRunsMillis配置就是定义了Evict的定时时间间隔。
数据源配置文件(database.properties)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8
user=root
password=root
minIdle=45
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
removeAbandonedTimeout=180
removeAbandoned=true