title: Basics - Troubleshooting Hibernate / JDBC Connection Pool Issue
body: <p>What is Hibernate's responsibility in regards to database connections it gets from an underlying connection pool. Does it test to see if a connection is closed before it uses it? and if so get another connection from the pool?</p>
  
  <p>I've included error and confirmation info below. Any ideas of where I can start to troubleshoot this would be very helpful. And any advice on the SQL Server driver settings we are using.</p>
  
  <p><strong>from the Catalina log:</strong>  </p>
  
  <pre>
  04-Nov-2010 21:54:52.691 WARNING org.apache.tomcat.jdbc.pool.ConnectionPool.abandon Connection has been abandoned PooledConnection[ConnectionID:8]:java.lang.Exception
      at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:926)
      at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:681)
      at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:545)
      at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:166)
      at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:106)
  </pre>
  
  <p><strong>from our application log:</strong>  </p>
  
  <pre>
  2010-11-04 21:54:52,705 [tomcat-http--18] WARN  util.JDBCExceptionReporter  - SQL Error: 0, SQLState: 08S01
  2010-11-04 21:54:52,707 [tomcat-http--18] ERROR util.JDBCExceptionReporter  - Socket closed
  2010-11-04 21:54:52,708 [tomcat-http--18] ERROR transaction.JDBCTransaction  - JDBC rollback failed
  java.sql.SQLException: Connection has already been closed.
      at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:112)
      at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94)
      at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:71)
      at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94)
      at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:132)
      at $Proxy38.rollback(Unknown Source)
      at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:217)
      at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:196)
      at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676)
      at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845)
      at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822)
      at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412)
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
      at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)
  </pre>
  
  <p><strong>The configuration</strong>:  </p>
  
  <pre><code>&lt;Resource defaultAutoCommit="false" defaultReadOnly="false"
          defaultTransactionIsolation="SERIALIZABLE"
          driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          fairQueue="false" initialSize="10"
          jdbcInterceptors="ConnectionState;StatementFinalizer"
          jmxEnabled="true" logAbandoned="true" maxActive="100"
          maxIdle="10" maxWait="30000"
          minEvictableIdleTimeMillis="10000" minIdle="10"
          name="com.ourcompany.ap.shoppingcart/datasource"
          password="somePassword" removeAbandoned="true"
          removeAbandonedTimeout="60" testOnBorrow="true"
          testOnReturn="false" testWhileIdle="false"
          timeBetweenEvictionRunsMillis="5000"
          type="javax.sql.DataSource"
          url="jdbc:sqlserver://approd\approd;databaseName=prod"
          useEquals="false" username="AccessPointNet"
          validationInterval="30000" validationQuery="SELECT 1"/&gt;`
  </code></pre>