2014-09-15 2 views
0

На самом деле я не могу понять, почему это происходит. Я запускаю некоторые корпоративные программы, от EJB до веб-приложения. Мой EJB использует MyBatis с моей почтой Postgres, в то время как он развернут с моим веб-приложением на примере JBoss-AS 7. на самом деле JBoss падает из-за сбоев соединений из пула, который я настроил на моем источнике данных JNDI в standalone.xml.MyBatis JNDI с JBoss не закрывает соединения

Мой источник данных сконфигурирован, как это в 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> 

Я также попытался вручную закрывайте SQLSession в моем DAO каждый раз, когда я его использую, но ничего не произошло.

Любое предложение?

ответ

0

Я хотел бы загрузить исходные банки соответствующих библиотек, создать проект с этими библиотеками в качестве зависимостей, включить удаленную отладку в jBoss7 и удаленную отладку, что происходит в jBoss и myBatis с подключениями. К счастью, все библиотеки программного обеспечения открыты. Не ошибка, но, по крайней мере, мы можем видеть, что внутри.

+0

Итак, ваше предложение - отслеживать как jboss, так и mybatis и видеть, кто собирается «с ума»? – abierto

+0

Я решил несколько проблем с помощью удаленной отладки. Код не так уж трудно понять, особенно если это вызвано большой болью :) –

0

Проблема заключается в том, что при звонке 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> 
+0

Я попытался установить closeConnection в true, а затем с помощью session.close(). Это сработало для меня ... – abierto

Смежные вопросы