2014-09-15 2 views
0

나는 이것이 실제로 일어나는 이유를 실제로 이해할 수 없다. EJB에서 Web-App으로 일부 엔터프라이즈 프로그램을 실행하고 있습니다. 내 EJB는 MyBatis을 내 Postgres DB와 함께 사용하고 웹 애플 리케이션은 JBoss-AS 7에 배포합니다. 실제로 JBoss는 연결이 standalone.xml의 JNDI 데이터 소스에 구성된 풀에서 초과하기 때문에 충돌합니다.MyBatis JNDI with JBoss with connections 연결을 닫지 않는 것

내 데이터 소스가 standalone.xml에서 다음과 같이 구성되어

<transactionManager type="MANAGED"> 
    <property name="closeConnection" value="false"/> 
</transactionManager> 
<dataSource type="JNDI"> 
    <property name="data_source" value="java:jboss/datasources/MyDBName"/> 
</dataSource> 

나는 또한에 시도했다 :

<datasource jndi-name="java:jboss/datasources/MyDBName" pool-name="MyDBName" enabled="true" use-java-context="true"> 
    <connection-url>jdbc:postgresql://localhost:5432/My_DB</connection-url> 
    <driver>postgresql-driver</driver> 
    <pool> 
     <min-pool-size>10</min-pool-size> 
     <max-pool-size>20</max-pool-size> 
     <prefill>true</prefill> 
    </pool> 
    <security> 
     <user-name>username</user-name> 
     <password>password</password> 
    </security> 
</datasource> 

본인은 MyBatis로-config.xml 파일에이 같은 내 데이터 소스를 구성한 내 DAO에서 수동으로 SQLSession을 닫을 때마다 아무 일도 일어나지 않았습니다.

의견이 있으십니까?

답변

0

관련 라이브러리의 소스 jar를 다운로드하고 종속성으로 이러한 라이브러리를 갖는 프로젝트를 만들고 jBoss7에서 원격 디버깅을 활성화하고 jBoss 및 myBatis 내에서 원격 디버깅을 연결로 연결합니다. 다행히 모든 소프트웨어 라이브러리는 오픈 소스입니다. 버그는 무료는 아니지만 적어도 내부에 무엇이 있는지 볼 수 있습니다.

+0

그래서 jboss와 mybatis를 모두 추적하고 "미친"사람을 확인하는 것이 좋습니다. – abierto

+0

원격 디버깅을 사용하여 몇 가지 문제를 해결했습니다. 코드가 이해하기 힘들지는 않습니다. 특히 큰 고통이있는 경우에 특히 그렇습니다. –

0

MANAGED 유형을 사용할 때 session.close()을 호출하면 connection.close()가 전송되지 않습니다. 따라서 org.apache.ibatis.transaction.TransactionFactory 인터페이스를 구현하는 클래스를 직접 만들면됩니다. 견본을보십시오;

public class ClosingTransaction implements Transaction { 
    private Connection connection; 
    public ClosingTransaction(Connection conn){ 
     connection = conn; 
    } 
    public void close() throws SQLException { 
    // this will call connection.close(), so the container knows 
    // to release the connection to the pool 
     connection.close(); 
    } 
    public void commit() throws SQLException { 
    //nothing, container managed 
    } 
    public Connection getConnection() { 
     return connection; 
    } 
    public void rollback() throws SQLException { 
    // nothing, container managed 
    } 
} 

public class ClosingTransactionFactory implements TransactionFactory { 
    public Transaction newTransaction(Connection conn, boolean autocommit) { 
    return new ClosingTransaction(conn); 
    } 
    public void setProperties(Properties props) { 
    } 
} 

mybatis-config.xml에서;

<transactionManager type="com.example.ClosingTransactionFactory"/> 
<dataSource type="JNDI"> 
    <property name="data_source" value="java:jboss/datasources/MyDBName"/> 
</dataSource> 
+0

closeConnection을 true로 설정 한 다음 session.close()를 사용하여 시도했습니다. 이것은 나를 위해 일했다 ... – abierto