最近是跟jdbc以及mysql刚上了,一直在做这块的代码。 最近就遇到了一个问题,mysql数据库有个自动连接断开时间。如果8个小时之内没有数据操作,这个连接就断开了,但是程序上不知道,这就出问题了。

问题的大致情况是这样,mysql在默认情况下,如果发现一个连接的空闲时间超过8小时,将会在数据库端自动关闭这个连接。而数据源并不知道这个连接已经关闭了,当它将这个无用的连接返回给某个dao时,dao就会报无法获取connection异常。 在网上查了下,大致有这么几种解决办法: 1.设置mysql的时间,wait_time,这个确实是个解决办法,但是网上都不推荐。因为假设一个连接长时间没有被使用的话,还不释放,有可能会导致空占资源,最后mysql连接越来越多,程序肯定会出问题。 2.创建一个连接,使用完后就关闭,下次用的时候再new一个。这个解决办法比较好,可是每次都new的话肯定会带来效率上的低下。由于要做一个并发量比较高的案例,这样的办法也不是太好。 3.使用连接池,在网上查了查,有c3p0,dbcp等等比较成熟的解决方案。 3.1我就看了看,选择了c3p0这个库来使用。 首先需要给c3p0设置一堆参数,使用properties或者xml文件都可以,我配置了以下几个内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!--刚开始建立几个连接-->
<initialPoolSize>3</initialPoolSize>
<!--连接池中最少有几个连接-->
<minPoolSize>3</minPoolSize>
<!--每次增加几个连接-->
<acquireIncrement>3</acquireIncrement>
<!--线程池中最多有几个连接-->
<maxPoolSize>50</maxPoolSize>
<!--最大空闲时间,小于mysql的8个小时就好-->
<maxIdleTime>60</maxIdleTime>
<!--隔这么长时间检测下连接是不是空闲的-->
<idleConnectionTestPeriod>600</idleConnectionTestPeriod>
<!--如果出错了,最多尝试重建多少次-->
<acquireRetryAttempts>30</acquireRetryAttempts>
<!--每次重连间隔多长时间-->
<acquireRetryDelay>1000</acquireRetryDelay>
<!--在取得连接的同时校验连接的有效性-->
<testConnectionOnCheckout>true</testConnectionOnCheckout>

然后解析这个xml文件,设置到连接池里面

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
dataSource=new ComboPooledDataSource();
try {
	dataSource.setDriverClass(driver);
	dataSource.setUser(username);
	dataSource.setPassword(password);
	dataSource.setJdbcUrl(url);
	dataSource.setInitialPoolSize(initialPoolSize);
	dataSource.setMinPoolSize(minPoolSize);
	dataSource.setAcquireIncrement(acquireIncrement);
	dataSource.setMaxPoolSize(maxPoolSize);
	dataSource.setMaxIdleTime(maxIdleTime);
	dataSource.setIdleConnectionTestPeriod(idleConnectionTestPeriod);
	dataSource.setAcquireRetryAttempts(acquireRetryAttempts);
	dataSource.setAcquireRetryDelay(acquireRetryDelay);
	dataSource.setTestConnectionOnCheckout(testConnectionOnCheckout);
} catch (PropertyVetoException e) {
	logger.warn(e.getMessage());
}

这样就配置好了,需要使用连接的时候直接ataSource.getConnection()就好了。 后来发现c3p0库有问题,假设过了8个小时的话,那个连接不会被丢弃,而是又会被扔到连接池里面去,所以在使用的时候最好写一个conn.close()保证不会出错。 3.2上面说了还有个dbcp这个库,网上也有挺多使用的,不过我没深入研究,有兴趣的可以去深入查询一下。

查询了这么多关与数据库的知识后,才发现原来学到的知识太少啦,要多接触点,多学习一点啦