Can JBossAS tell me when I don't close connections, statements or resultsets?







For connections the configuration is in deploy/transaction-service.xml

    <attribute name="Debug">true</attribute>


Starting with 4.0.0, the configuration is in deploy/jbossjca-service.xml

     | The CachedConnectionManager is used partly to relay started UserTransactions to 
     | open connections so they may be enrolled in the new tx.
  <mbean code="org.jboss.resource.connectionmanager.CachedConnectionManager" 
    <depends optional-attribute-name="TransactionManagerServiceName">jboss:service=TransactionManager</depends>

    <!-- Enable connection close debug monitoring -->
    <attribute name="Debug">true</attribute>



The generated message look like this (JBoss 4.x):

2010-02-24 08:10:04,086 WARN [org.jboss.resource.connectionmanager.CachedConnectionManager] Closing a connection for you.  Please close them yourself: org.jboss.resource.adapter.jms.JmsSession@745889

java.lang.Throwable: STACKTRACE




Note!! To have this applied to connections openned by Servlets or JSP's see below {FOOTNOTE DEF 1 1}.




Statements and ResultSets


For statements (and from 3.2.4 ResultSets) you can add the following to your -ds.xml




Closing statements and ResultSets is important if you want to use prepared statement caching

and/or don't won't to leak cursors in your database.



The generated messages looks like this (JBoss 4.x):

2010-02-24 08:10:04,086 WARN  [org.jboss.resource.adapter.jdbc.WrappedConnection] Closing a result set you left open! Please close it yourself.
java.lang.Throwable: STACKTRACE
        at org.jboss.resource.adapter.jdbc.WrappedStatement.registerResultSet(



2010-02-24 08:10:04,102 WARN  [org.jboss.resource.adapter.jdbc.WrappedConnection] Closing a statement you left open, please do your own housekeeping
java.lang.Throwable: STACKTRACE
        at org.jboss.resource.adapter.jdbc.WrappedConnection.registerStatement(







Servlets and JSP {FOOTNOTE RED #1 1}



From from 3.2.4 this checking is available in the web layer.



Enable the CachedConnectionValve by uncommenting the following in deploy/jbossweb-xxx.sar/server.xml:

         <!-- Check for unclosed connections -->
        <Valve className="org.jboss.web.tomcat.tc5.jca.CachedConnectionValve"
            cachedConnectionManagerObjectName="jboss.jca:service=CachedConnectionManager" ></Valve>


NOTE: From 4.0.0 the CachedConnectionValve should be configured this way:

        <Valve className="org.jboss.web.tomcat.tc5.jca.CachedConnectionValve"
            transactionManagerObjectName="jboss:service=TransactionManager" ></Valve>


JBoss 4.0.0 distribution still had the previous configuration that woulld cause a NullPointerException

in CachedConnectionValve.checkTransactionComplete(


Once the valve is enabled, the CachedConnectionManager must be registered in deploy/jbossweb-xxx.sar/META-INF/jboss-service.xml.

At the end of the file, uncomment:







Production and Stress Testing



In production you will want to turn these off. You should have found all your leaks during development.