[英]hibernate hangs on accessing prepared statement
我們的應用程序(大約50個並行線程)正在使用hibernate 5.1.0,並且工作得很好。 但是有時會發生5或6個線程同時停止工作的情況。 也不例外,它只是卡住並掛起。 jConsole的StackTrace指向statement.isWrapperFor(type);上一個名為ResultSetReturnImpl.java的休眠類。
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)
ResultSetReturnImpl.java的內容:
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還是數據庫問題,希望有人能給我提示。
檢查數據庫中是否有任何表鎖,如果有,請刪除它們。 檢查並發用戶限制是多少之后
再說一遍,是否正確索引了您的表,請嘗試檢查查詢/過程的執行時間(如果這樣做的話)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.