Spring管理のタイミングタスクの場合、サーバーが機能しません。解決方法です。


最近は定時にメールを送る機能を作りましたが、いくつかの問題がありました。今みんなと分かち合おう!
私が使ったのは環境までです。   Linux+Struts 2+Spring+Hiberg+Tomcat 6.0+MySQL。
DBCP接続池を採用し、SpringでHibernateの配置を管理しています。
タイミング機能設定:

         <bean id="someData" class="com.xxxx.web.utils.JobData">
		
	</bean>
	<bean id="someJob" class="com.xxxx.web.utils.EmailReportJob">
   		<property name="jobData" ref="someData"></property>
   		<property name="songService" ref="songService"></property>
   		<property name="customerService" ref="customerService"></property>
	</bean>
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	    <property name="targetObject" ref="someJob"></property>
	    <property name="targetMethod" value="execute"></property>
	</bean>
	<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
	    <property name="jobDetail" ref="jobDetail"></property>
	    <property name="cronExpression" value="0 0 8 * * ?"/>
	</bean>
	<bean id="scheduledFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	   <property name="triggers">
	     <list>
	       <ref bean="cronTriggerBean"/>
	     </list>
	   </property>
         <property name="autoStartup" value="true"/>
         </bean>
このように配置し終わったらいいです。注意
<property name=「cronExpression」value=「0 0 8*?」/>時間の設定フォーマット。
配置が終わったらLinux環境に配置します。結果はメールで送ることができます。やっとできたと思います。思わなかったのは翌日の8時には機能しませんでした。楽屋では多くのエラーを報告しました。
エラーメッセージ:

java.io.EOFException
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
        at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5371)
        at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)
        at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)
私はMySQLのタイムアウトを見ました。MySQLのプロファイルを見ましたが、デフォルトは8時間です。私は24時間で一回だけ実行します。DBCPの配置を見ましたが、これらの属性を設定するのを忘れました。本当に失敗しました。
設定を追加した後:


jdbc.connection.driver_class=com.mysql.jdbc.Driver
jdbc.connection.url=jdbc:mysql://127.0.0.1:3306/xxxx?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=gbk
jdbc.username=root
jdbc.password=0
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
validationQuery=select 1
#dbcp.validationQueryTimeout=1
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=20
hibernate.dialect=org.hibernate.dialect.MySQLDialect


<!--       -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>${jdbc.connection.driver_class}</value>
		</property>
		<property name="url">
			<value>${jdbc.connection.url}</value>
		</property>
		<property name="username">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
		<property name="testWhileIdle">
			<value>${testWhileIdle}</value>
		</property> 
		<!--     ,     evict     -->   
        <property name="testOnBorrow">
        	<value>${testOnBorrow}</value>
        </property>   
        <property name="testOnReturn">
        	<value>${testOnReturn}</value>
        </property>   
        <property name="validationQuery">
        	<value>${validationQuery}</value>
        </property>
             
        <property name="timeBetweenEvictionRunsMillis">
        	<value>${timeBetweenEvictionRunsMillis}</value>
        </property>   
        <property name="numTestsPerEvictionRun">
        	<value>${numTestsPerEvictionRun}</value>
        </property>	
</bean>
このように配置し終わったらいいです。一つ注意するのは
<property name=「validationQuery」<value>select 1の中のvalue値はデータベースによって違います。具体的には何ですか?
DBCP:
属性validationQueryに簡単なSQL文をセットすればいいです。例えば、select 1(mysqlとsql serverが適用されます)、SELECT COUNT(*)FROM DUAL(oracle)
今は使えます。具体的な詳細は私にレスしてもいいです。みんなで熱心に討論してほしいです。