簡體   English   中英

休眠掛起訪問准備好的語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM