2016-09-08 4 views
0

ログはlogger.warn( "Start:preparedStatement.executeQuery()")で停止します。無期限にハングアップします。ログに例外はスローされません。クエリーは情報列の下のSHOW FULL PROCESSLISTに表示されません。これはクエリーが実行されていないことを意味します。私はコマンドラインでクエリを実行することができ、すべての行を戻すのに1秒未満かかりません。 IN_USE <> 0のオープンテーブルを表示すると空のセットが返され、テーブルはロックされません。 JDK 1.8、MySQL 1.6、InnoDBを使用する。 *編集:これはAWS上で実行されており、ハングする前にCPU使用率が大幅に上昇していることに気付きました。ExecuteQuery不明な理由でハングします。消耗した共通の解決策

public void setup(StringBuilder sql, String[] args, RowMapper<I> rowMapper) throws SQLException{ 
    this.rowMapper = rowMapper; 
    //Create prepared statement 
    connection.setAutoCommit(false); 
    logger.warn("Start: Connection.preparedStatement"); 
    preparedStatement = connection.prepareStatement(sql.toString(),ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
    logger.warn("End: Connection.preparedStatement"); 
    preparedStatement.setFetchSize(fetchSize); 
    //Setting SQL arguments 
    int i = 1; 
    for(String var: args){ 
     preparedStatement.setString(i++, var); 
    } 
    logger.warn("Start: preparedStatement.executeQuery()"); 
    resultSet = preparedStatement.executeQuery(); 
    logger.warn("End: preparedStatement.executeQuery()"); 
} 
+0

コードが正常に表示されているので、デバッグモードで起動し、すべてのスレッドをフリーズして、どこに保持されているかを確認することをお勧めします。多分それはあなたにある方向を与えるでしょう。 –

+0

未ログインの例外?あなたのログが表示され、MySQLの終わりでクエリが実行されておらず、 "done"ログが表示されない場合、スレッドはそれらのログラインの間でスレッドを停止しました。スレッドダンプ? –

+0

アプリケーションをローカルでデバッグすることは良い考えでした – Jimifredjr

答えて

0

解決済み。 StatementImpl.class Version 1.5に、スレッドがハングしていたロックが外れてくるのを待っていた1373行目の同期ロックがありました。私は同時に複数の結果セットを開いているので、それぞれの結果セットに独自の接続を設定し、フェッチサイズをInteger.MIN_VALUEに設定してアプリケーションが停止していません。

関連する問題