2011-08-03 41 views
0

我有一個部署在Tomcat 5.5容器中的Web應用程序。我使用了一個在數據庫中記錄一些活動的SessionEventListener bean。有時候,我得到這個錯誤信息:StandardXAConnectionHandle:prepareStatement不應該在EJBServer之外使用

java.sql.SQLException: StandardXAConnectionHandle:prepareStatement should not be used outside an EJBServer 
    at org.enhydra.jdbc.standard.StandardXAConnectionHandle.prepareStatement(StandardXAConnectionHandle.java:310) 
    at org.enhydra.jdbc.standard.StandardXAConnectionHandle.prepareStatement(StandardXAConnectionHandle.java:255) 
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:233) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:532) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:739) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:762) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:213) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:217) 
    at hu.rate.session.RateDBSessionRegistry$4.doInTransactionWithoutResult(RateDBSessionRegistry.java:124) 
    at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:33) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:127) 
    at hu.rate.session.RateDBSessionRegistry.refreshLastRequest(RateDBSessionRegistry.java:120) 

失敗的代碼如下:

txTemplate.execute(new TransactionCallbackWithoutResult() { 
      @Override 
      public void doInTransactionWithoutResult(
        TransactionStatus paramTransactionStatus) { 
       if(template.update(us, paramMap) == 0) { 
        logger.warn("No session in registry to be refreshed, sessionId = " + sessionId); 
       } 
      } 
     }); 

public void setTxManager(PlatformTransactionManager txManager) { 
     txTemplate = new TransactionTemplate(txManager); 
    } 

我的Spring bean的配置是這樣的:

<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" /> 
    <bean id="txManager" 
     class="org.springframework.transaction.jta.JtaTransactionManager"> 
     <property name="userTransaction"> 
      <ref local="jotm" /> 
     </property> 
    </bean> 

我真的不明白這一點問題,你能解釋我什麼是錯的,以及如何解決它?

+0

今天再次出現同樣的問題。現在開始賞金,看看有人能幫助我。 – jabal

+0

您能否啓用調試日誌級別並查看它在StandardXAConnectionHandle中的走向有多遠?當你使用JDBC時,你自己是在破壞事務還是在某處處理連接?這可能會干擾交易和連接如何與JTA進行管理 - 實質上,JTA不應該處理這些問題。也許連接已經關閉,tx提交了,或者我不知道是什麼,這可能會產生時間相關的錯誤。 – ewernli

回答

1

根據this page我發現它看起來像是由一個潛在的NullPointerException引起的。另外有趣的是,如果你想使用PreparedStatements,你需要註釋掉兩行並取消其他兩行的註釋,那麼下面的代碼會有一個註釋。可能值得研究。

+0

謝謝,我也看到了這個評論,但改變源代碼和重新編譯XAPool不是我的選擇。我通過恢復到普通的JDBC代碼解決了這個問題,但賞金仍然存在,因爲我想得到一個很好的解釋,我錯了什麼。 – jabal

+0

啊,你應該以任何方式發佈你的答案,以便其他人知道如何解決。也許在賞金到期或獎勵後這樣做? –

+0

你是對的,但是我所做的(切換回JDBC)不是解決方案,也不是我的問題的答案。 – jabal

相關問題