我对Seam 2.2.2,JBoss 5.1,MySQL 5.1.5.1和MySQL JDBC连接器5.1.12以及异步方法(使用quartz)和pojos都有一种奇怪的行为。
我为各种任务提供了10个异步线程池。它们通常工作正常,执行数据库查询和更新等。 如果一个异步方法中存在异常,则不会影响从同一个线程调用的下一个异步方法。
但我现在有一个案例,我在一个特定的线程中得到这个例外:
012-10-02 05:45:26,743 WARN [][JDBCExceptionReporter] (er-4) SQL Error: 0, SQLState: null
2012-10-02 05:45:26,743 ERROR [][JDBCExceptionReporter] (er-4) Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000001:b824:5069f752:15d status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000001:b824:5069f752:15d status: ActionStatus.ABORT_ONLY >)
2012-10-02 05:45:26,743 INFO [][DefaultLoadEventListener] (er-4) Error performing load command
org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573)
此后每次使用此线程(er-4)并执行查询时,我都会得到相同的异常。 我怎样才能从中恢复,为什么会这样? 这个线程调用什么方法(它们用@Transactional注释)并不重要,因为GenericJDBCException它们都失败了:无法打开连接。 这个问题突然出现了。
我正在使用数据库连接池并在每次使用之前验证连接(来自部署描述符):
<!--pooling parameters-->
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>
<prepared-statement-cache-size>50</prepared-statement-cache-size>
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
这是我的代码的问题吗?与Seam? JBoss的? MySQL的? JDBC MySQL驱动程序?
是否有其他人遇到类似的问题。
答案 0 :(得分:2)
问题是由进行批处理的方法引起的。它直接处理了UserTransaction,但没有处理异常。
e.g。
UserTransaction userTx = null;
try{
log.info("Updating List from #0 on", startAt);
userTx = (UserTransaction) org.jboss.seam.Component.getInstance("org.jboss.seam.transaction.transaction");
userTx.setTransactionTimeout(10 * 60); //set timeout to 60 * 60 = 3600 secs = 1 h
userTx.begin();
/*If entity manager is created before the transaction is started (ie. via Injection) then it must join the transaction */
entityManager.joinTransaction();
//DO STUFF
userTx.commit();
}catch(Exception e){
e.printStackTrace();
return false;
}
catch语句应该包含userTx.rollback(),否则该线程的事务将保持不可用状态。
答案 1 :(得分:0)
连接是否已闲置一段时间(例如8小时)?
MySQL在8小时后丢弃TCP连接(默认情况下;可配置)。
您必须实现重新连接逻辑。