hibernate挂起访问准备好的语句

时间:2016-10-14 10:26:08

标签: java multithreading hibernate oracle11g ojdbc

我们的应用程序(大约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或数据库问题,并希望有人能给我一个提示。

1 个答案:

答案 0 :(得分:0)

检查数据库你有没有任何表锁,如果有任何请删除那些。检查了什么是并发用户限制

还有一个,就是你的表被正确编入索引,尝试检查查询/程序的执行时间,如果它更精细地调查查询