2011-08-03 4 views
0

웹 응용 프로그램을 Tomcat 5.5 컨테이너에 배포했습니다. 데이터베이스의 일부 활동을 기록하는 SessionEventListener 빈을 사용합니다. 다음StandardXAConnectionHandle : EJBServer 외부에서 prepareStatement를 사용해서는 안됩니다.

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

관련 문제