2017-11-22 21 views
0

Tomcat接続プールエラーで苦労しています。以下のエラーは、実行時にString値を生成する単純なストアドプロシージャを実行した後にスローされます。Tomcat接続プールが放棄された問題

WARNING: Connection has been abandoned PooledConnection[ConnectionID:45 ClientConnectionId: 7817280c-3f7e-4239-a009-3aedd0a855e8]:java.lang.Exception 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1096) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:799) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:648) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:200) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128) 
    at util.ThreadLocalUtil.getConnection(ThreadLocalUtil.java:55) 
    at webapp.dao.WebApplicationDAO.getConnection(WebApplicationDAO.java:30) 
    at webapp.dao.AccountDAO.generateAccountId(AccountDAO.java:827) 
    at webapp.bo.Account.generateUserAccountId(Account.java:285) 
    at webapp.actions.AddUserAccountUNZAction.execute(AddUserAccountUNZAction.java:79) 
    at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) 
    at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) 
    at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 

このエラーの情報は、接続が開かれていて閉じていないことです。アカウントdaoでストアドプロシージャを実行すると、接続が開きます。以下は、ストアドプロシージャを呼び出すコードのブロックです。

Connection conn = null; 
    CallableStatement stmt = null; 
    ResultSet rs = null; 
    try { 

     conn = getConnection(); 
     stmt = conn.prepareCall(sqlWebAppGenerateUserId); 
     stmt.setString(1, base); 
     rs = stmt.executeQuery(); 
     String res = null; 
     if (rs.next()) { 
      res = rs.getString(1); 
     } 

     if (res == null) { 
      throw new RuntimeException("Failed to generate user id."); 
     } 

     return res; 
    } catch (SQLException e) { 
     LOG.error("{}", e); 
     throw new RuntimeException(e); 
    }finally { 
     if (stmt != null) { 
      try { 
       stmt.close(); 
      } catch (SQLException e) { 
       LOG.error(e.getMessage(), e); 
      } 
     } 
     if (rs != null) { 
      try { 
       rs.close(); 
       conn.close(); 
      } catch (SQLException e) { 
       LOG.error(e.getMessage(), e); 
      } 
     } 

    } 

あなたが見ることができるように、私は最終的に接続を閉じるようにブロック使用しているなど

私は、エラーがまだスローされ、どのようにようにしている理由を説明するために途方に暮れてよ私はこの問題をデバッグして解決することができます。どんな助けにも大いに感謝されます

+0

まず、[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)を使用して開始してください。それでも問題が解決しない場合は、新しい質問を投稿してください。 –

答えて

0

@カヤマンと@Gorazdアドバイスありがとうございます。 Tomcatのlibフォルダにあるjarファイルが見つからないという問題があります。より具体的には、mail-1.4.jar。

このjarファイルが見つからないため、電子メールを送信する関数が失敗しました。メールを送信するための呼び出しの前に、connection.autocommitはtrueに設定されています。メールの送信後、自動コミットをfalseに戻します。私にとってこれは、放棄されたエラーがどこから発生したかのように見えます。

ログファイルを調べると、メールの送信エラーが見つかりました。これは実際には真のエラーであったが、放棄されたエラーは赤いニシンとして見ることができた。

1

rs != nullの場合にのみ、connを閉じます。これは、クエリが失敗するたびに接続が閉じられないことを意味します。

最終的にclumsyを書き込むのではなく、try-with-resourcesに切り替えることをお勧めします。これによりバグが発生する可能性があります。

0

@カヤマンは言った。また、文の実行にremoveAbandonedTimeoutよりも時間がかかる場合、これが発生する可能性があります。

関連する問題