私たちのアプリケーション(約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またはデータベースの問題であるかどうか、誰かが私にヒントを与えることができることを願っています。