Java StandardXConnectionHandle:prepareStatement不应在EJBServer外部使用
我在Tomcat5.5容器中部署了一个web应用程序。我使用一个Java StandardXConnectionHandle:prepareStatement不应在EJBServer外部使用,java,database,tomcat,jdbc,transactions,Java,Database,Tomcat,Jdbc,Transactions,我在Tomcat5.5容器中部署了一个web应用程序。我使用一个SessionEventListenerbean来记录数据库中的一些活动。有时我会收到以下错误消息: java.sql.SQLException: StandardXAConnectionHandle:prepareStatement should not be used outside an EJBServer at org.enhydra.jdbc.standard.StandardXAConnectionHandle.
SessionEventListener
bean来记录数据库中的一些活动。有时我会收到以下错误消息:
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);
}
我的SpringBean配置如下所示:
<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>
我真的不明白这个问题,你能解释一下什么地方出了问题以及如何解决吗?根据我发现的,它看起来像是由潜在的NullPointerException引起的。同样有趣的是,在代码的正下方有一条注释,如果您想使用PreparedStatements,您需要注释掉两行并取消注释另外两行。可能值得研究。今天,同样的问题再次出现。现在开始悬赏,看看是否有人能帮我。你能启用调试日志级别,看看它在StandardXAConnectionHandle中能走多远吗?当您使用JDBC时,您是自己处理事务还是处理某个地方的连接?这可能会干扰使用JTA管理事务和连接的方式——本质上,使用JTA您根本不应该处理这个问题。可能是连接已关闭,tx已提交,或者我不知道是什么,这可能会产生与时间相关的bug。谢谢,我也看到了此评论,但更改源代码并重新编译XAPool不是我的选择。我通过恢复到普通的旧JDBC代码解决了这个问题,但是悬赏仍然存在,因为我想得到一个很好的解释,我错在哪里了。啊,你应该发布你的答案,让其他人知道如何解决。也许在赏金到期或被授予后再做?你是对的,但是我所做的(切换回JDBC)既不是解决方案,也不是对我问题的回答。