jdbc - Seam 异步方法中的事务/数据库问题

标签 jdbc jboss transactions seam quartz-scheduler

我对 Seam 2.2.2、JBoss 5.1、MySQL 5.1.5.1 和 MySQL JDBC 连接器 5.1.12 以及异步方法(使用quartz)和 pojo 有一个奇怪的行为。

我有一个包含 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: Cannot open connection 而失败。 问题突然出现。

我正在使用数据库连接池并在每次使用之前验证连接(来自部署描述符):

  <!--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>

这是我的代码有问题吗?与缝?杰老板? MySQL? JDBC MySQL 驱动程序?

还有其他人遇到过类似的问题吗?

最佳答案

该问题是由执行批处理的方法引起的。它直接处理 UserTransaction 但不处理异常。

例如

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(),否则该线程的事务将处于不可用状态。

关于jdbc - Seam 异步方法中的事务/数据库问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12705043/

相关文章:

java - 如何获取应用程序退出前读取的数据库表的最后一行行号

java - JDBC准备好的语句/引用另一个准备好的语句中的准备好的语句

java - RuntimeException : java. io.IOException : unexpected element (uri :"urn:infinispan:config:4.2", 本地 :"property")。预期元素为 <{}entry>

javascript - 使用 mongodb (waterline.js) 和 node.js (sails.js) 解决事务

java - 更改日期格式并将其存储在 mysql 中的变量中

java - 使用 JDBC 连接数据库的时间

mysql - 如何使用MySQL正确处理金钱交易?

java - SOA 中服务间的原子性和一致性

.NET企业应用平台(同JBoss转Java)

JBOSS,如何添加依赖javax.jmx?