StandardXAConnectionHandle: prepareStatement не должен использоваться вне EJBServer - PullRequest
0 голосов
/ 03 августа 2011

У меня есть веб-приложение, развернутое в контейнере Tomcat 5.5. Я использую бин SessionEventListener, который регистрирует некоторые действия в базе данных. Иногда я получаю это сообщение об ошибке:

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);
    }

Моя конфигурация bean-компонента Spring выглядит следующим образом:

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

Я не очень понимаю эту проблему, вы можете объяснить мне, что не так и как это исправить?

1 Ответ

1 голос
/ 31 августа 2011

Согласно этой странице я обнаружил, что похоже, что это вызвано лежащим в основе NullPointerException. Также достаточно интересно, что в этом коде есть комментарий под ним, если вы хотите использовать PreparedStatements, вам нужно закомментировать две строки и раскомментировать две другие строки. Может стоит посмотреть.

...