Java MyBatis JNDI与JBoss未关闭连接

Java MyBatis JNDI与JBoss未关闭连接,java,jboss,jndi,connection-pooling,mybatis,Java,Jboss,Jndi,Connection Pooling,Mybatis,我真的不明白为什么会这样。我正在运行一些企业程序,从EJB到Web应用程序。我的EJB将MyBatis与我的Postgres DB一起使用,而将MyBatis与我的web应用一起部署在JBoss AS 7的实例上。实际上,JBoss崩溃是因为连接超出了我在standalone.xml中的JNDI数据源上配置的池 我的数据源在standalone.xml中的配置如下: 我已将数据源这样配置到mybatis-config.xml中: <transactionManager type="MANA

我真的不明白为什么会这样。我正在运行一些企业程序,从EJB到Web应用程序。我的EJB将MyBatis与我的Postgres DB一起使用,而将MyBatis与我的web应用一起部署在JBoss AS 7的实例上。实际上,JBoss崩溃是因为连接超出了我在standalone.xml中的JNDI数据源上配置的池

我的数据源在standalone.xml中的配置如下:

我已将数据源这样配置到mybatis-config.xml中:

<transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
</transactionManager>
<dataSource type="JNDI">
    <property name="data_source" value="java:jboss/datasources/MyDBName"/>
</dataSource>
我还尝试在每次使用DAO时手动关闭SQLSession,但什么也没发生


有什么建议吗?

我会下载相关库的源JAR,创建一个将这些库作为依赖项的项目,在jBoss7中启用远程调试,并通过连接远程调试jBoss和myBatis中的情况。幸运的是,所有软件库都是开源的。虽然没有bug,但至少我们可以看到里面有什么。

问题是,当您使用托管类型调用session.close时,它不会发送连接。close。因此,您可以创建自己的类来实现org.apache.ibatis.transaction.transaction工厂接口。见样本

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>

所以你的建议是跟踪jboss和mybatis,看看谁疯了?我已经通过远程调试解决了几个问题。这段代码并不难理解,特别是如果它造成了很大的麻烦:我尝试将closeConnection设置为true,然后使用session.close。这对我有用。。。
<transactionManager type="com.example.ClosingTransactionFactory"/>
<dataSource type="JNDI">
    <property name="data_source" value="java:jboss/datasources/MyDBName"/>
</dataSource>