2016-10-14 21 views
0

私たちのアプリケーション(約50並列スレッド)は、hibernate 5.1.0を使用していて非常にうまく動作します。しかし時々、5〜6本のスレッドが同時に作業を停止することがあります。例外なく、ちょうど立ち往生してハングします。 jConsoleのStackTraceは、statement.isWrapperFor(type)のResultSetReturnImpl.javaというHibernateクラスを指します。 ResultSetReturnImpl.javaの準備完了ステートメントへのアクセス時にhibernateがハングアップする

Stack trace: 
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.isTypeOf(ResultSetReturnImpl.java:95) 
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:58) 
org.hibernate.loader.Loader.getResultSet(Loader.java:2115) 
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) 
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1874) 
org.hibernate.loader.Loader.doQuery(Loader.java:919) 
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
org.hibernate.loader.Loader.doList(Loader.java:2610) 
org.hibernate.loader.Loader.doList(Loader.java:2593) 
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422) 
org.hibernate.loader.Loader.list(Loader.java:2417) 
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) 
org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) 
org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) 
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339) 
org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) 

内容:

public ResultSet extract(PreparedStatement statement) { 
    // IMPL NOTE : SQL logged by caller 
    Line 58: if (isTypeOf(statement, CallableStatement.class)) { 
     // We actually need to extract from Callable statement. Although 
     // this seems needless, Oracle can return an 
     // OracleCallableStatementWrapper that finds its way to this method, 
     // rather than extract(CallableStatement). See HHH-8022. 
     final CallableStatement callableStatement = (CallableStatement) statement; 
     return extract(callableStatement); 
    } 
    try { 
     final ResultSet rs; 
     try { 
      jdbcExecuteStatementStart(); 
      rs = statement.executeQuery(); 
     } 
     finally { 
      jdbcExecuteStatementEnd(); 
     } 
     postExtract(rs, statement); 
     return rs; 
    } 
    catch (SQLException e) { 
     throw sqlExceptionHelper.convert(e, "could not extract ResultSet"); 
    } 
} 

private boolean isTypeOf(final Statement statement, final Class<? extends Statement> type) { 
    if (isJdbc4) { 
     try { 
      // This is "more correct" than #isInstance, but not always supported. 
Line 95:   return statement.isWrapperFor(type); 
     } 
     catch (SQLException e) { 
      // No operation 
     } 
     catch (Throwable e) { 
      // No operation. Note that this catches more than just SQLException to 
      // cover edge cases where a driver might throw an UnsupportedOperationException, AbstractMethodError, 
      // etc. If so, skip permanently. 
      isJdbc4 = false; 
     } 
    } 
    return type.isInstance(statement); 
} 

システムがojdbc7.jar使用しています。私はそれを解決する必要があります。なぜなら、ハングスレッドは次の要求を処理できず、受信したすべてのメッセージが失われるからです。私はそれがハイバネート、jdbc、javaまたはデータベースの問題であるかどうか、誰かが私にヒントを与えることができることを願っています。

答えて

0

データベースを確認してください。テーブルロックがあるかどうか確認してください。もしあれば削除してください。同時接続ユーザーの制限は

1以上何をされていることを確認した後、それはクエリ

より微調整だ場合、クエリ/プロシージャの実行時間をチェックしてみてください、あなたのテーブルが適切にインデックス化されています
関連する問題