后台服务器搭建和运维时遇到的一些问题-2

2016-06-23 | 阅读

在数据库连接超时的问题。

java web中,一般使用DBCP作为数据库连接池。

Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection 。手写JDBC时,常会定时6小时刷一次数据库连接。查阅资料后,我们有知道另外两种方法来解决这个问题。

设置validationQuery

		<property name="validationQuery">
			<value>select 1</value>
		</property>

只需要设置这个值就行了,不需要设置testWhileIdle,这个值的意思,每次从连接池返回连接时,先执行这段命令以校验连接的有效性,在不同数据库中校验的语句是不同的,大多数数据库和Mysql中,用这句就可以了。

配置timeBetweenEvictionRunsMillisminEvictableIdleTimeMillis

	<property name="minEvictableIdleTimeMillis">
		<value>360000</value>
	</property>
	<property name="timeBetweenEvictionRunsMillis">
		<value>360000</value>
	</property>

这两个值组合起来,表示的含义是 :在数据连接池中,每隔timeBetweenEvictionRunsMillis 毫秒的时间,去检测数据库连接闲置时间是否超过了minEvictableIdleTimeMillis,如果闲置时间超时,则连接销毁;然后再检测数据库连接是否充足,不够再创建新的连接。

然后再讨论两种做法的优劣,第一种做法,每次都能完全确定数据库连接是可用的,但是造成了没有必要的性能消耗,如果对性能有过高的要求,肯定不能这么做。第二种做法,数据库连接基本不会超时了,但是数据库连接其实可能还是不够安全,譬如,我把数据库重启了,那数据库连接池中的连接都是失效的,但是第一种方法就能检测出来,第二种方法就检测不出来。