我们的应用程序(大约50个并行线程)正在使用hibernate 5.1.0并且工作得非常好。但有时会发生5或6个线程同时停止工作。也不例外,它只是停滞不前。 jConsole的StackTrace指向statement.isWrapperFor(type)上名为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)
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。我需要解决它,因为挂起的线程无法处理以下请求,并且所有收到的消息都将丢失。我不知道它是否是一个hibernate,jdbc,java或数据库问题,并希望有人能给我一个提示。
答案 0 :(得分:0)
检查数据库你有没有任何表锁,如果有任何请删除那些。检查了什么是并发用户限制
还有一个,就是你的表被正确编入索引,尝试检查查询/程序的执行时间,如果它更精细地调查查询