【问题标题】:MyBatis JNDI with JBoss not closing connections带有 JBoss 的 MyBatis JNDI 未关闭连接
【发布时间】:2014-09-15 07:57:16
【问题描述】:

我实际上无法理解为什么会发生这种情况。我正在运行一些企业程序,从 EJB 到 Web-App。我的 EJB 将 MyBatis 与我的 Postgres DB 一起使用,而与我的 web 应用程序一起部署在 JBoss-AS 7 的实例上。实际上,JBoss 崩溃是因为连接超出了我在 standalone.xml 中的 JNDI 数据源上配置的池。

我的数据源在standalone.xml中是这样配置的:

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

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

我也尝试在每次使用 DAO 时手动关闭 SQLSession,但没有任何反应。

有什么建议吗?

【问题讨论】:

    标签: java jboss jndi connection-pooling mybatis


    【解决方案1】:

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

    【讨论】:

    • 所以你的建议是同时跟踪jboss和mybatis,看看谁“发疯”了?
    • 我已经使用远程调试解决了自己的几个问题。代码并不难理解,特别是如果它引起了很大的痛苦:)
    【解决方案2】:

    问题是当你调用session.close() 时使用MANAGED 类型时它不会发送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>
    

    【讨论】:

    • 我尝试将 closeConnection 设置为 true,然后使用 session.close()。这对我有用...
    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多