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