第一: 说明
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。connections如果空闲超过8小时,Mysql将其断开,而DBCP并不知道该connection已经失效,如果这时有 Client请求connection,DBCP将该失效的Connection提供给Client,将会造成上面的异常。
第二: 方案
(1),是用定时器,connection空闲8小时 mysql就是自动断开,所以使用定时器,在每七小时之间就查询一下mysql数据库的数据(这个可以随便查询自己的数据,只是为了建一次连接,不让mysql自己的断开)。
(2), 在JAVA中实现定时器功能要用的二个类是Timer,TimerTask。
(3), 我这里使用的是TimerTask,ssh框架,除了ssh的一些基本jar包,还需要导入quartz-1.8.5.jar
(4), TimerTask类:
/**
*
* 定时器
*
* */
public class TimerTas{
private IMemberService memberService;
public IMemberService getMemberService() {
return memberService;
}
public void setMemberService(IMemberService memberService) {
this.memberService = memberService;
}
public TimerTask() {
System.out.println("计划任务被初始化了");
}
public void doTask() {
List<Member> members=memberService.All();
System.out.println("七个小时查询会员表的size:"+members.size());
}
}
(5),配置applicationContext.xml 文件
<!-- 注册定时器 -->
<bean id="timer" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="timerTaskTrigger" />
</list>
</property>
</bean>
<!-- 指定何时触发定时任务 -->
<bean id="timerTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="timerTaskJobDetail" />
</property>
<property name="cronExpression">
<!-- 每7小时钟触发一次(这个时间可以自己设置,我这里是每7小时执行一次) -->
<value>0 0 */7 * * ?</value>
</property>
</bean>
<!-- 指定定时任务细节 调用哪个类 哪个方法 -->
<bean id="timerTaskJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="timerTaskInstance" />
</property>
<property name="targetMethod">
<value>doTask</value>
</property>
<property name="concurrent" value="false" />
</bean>
<!-- 实例化定时任务类 -->
<bean id="timerTaskInstance" class="com.lc.util.TimerTask">
<property name="memberService" ref="memberService"></property>
</bean>