3

さまざまなステートメントで構成される SQL クエリがあります (これは簡略化されたバージョンであり、これもエラーをトリガーします)。

private static String getActiveKeyEventsSql =
        "SET @report_model_id = 2; " +
        "SELECT MAX(report_ts) AS report_ts " + 
        "FROM `pulse_data`.`key_event_reports` " + 
        "WHERE report_model_id = @report_model_id ";

Java アプリケーション内からそのステートメントを呼び出そうとしています:

public static void main(String[] args) throws Exception {
    MySQLLayer _db = new MySQLLayer();

    Connection _conn = null;
    try {
        _conn = _db.getConnection();
        PreparedStatement getActiveKeyEventsStmt = _conn.prepareStatement(getActiveKeyEventsSql);
        ResultSet rs = getActiveKeyEventsStmt.executeQuery();

        while (rs.next()) {
            LOG.info(rs.getLong("report_ts"));
        }
    } catch (SQLException e) {
        LOG.error("COULD NOT GET MAX REPORT.", e);
    } finally {
        try {
            if (_conn != null && !_conn.isClosed()) {
                _conn.close();
            }
        } catch (SQLException e) {
            LOG.info("COULD NOT CLOSE CONNECTION.", e);
        }
    }
}

ただし、次のエラーが発生します。

java.sql.SQLException: ResultSet is from UPDATE. No Data.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6870)
    at com.stockpulse.stockstorm.sentiment.JavaTest.main(JavaTest.java:36)

私のアプリケーションの他の場所では、このスキーマは問題なく機能します。このステートメントを MySQL コンソールにコピーすると、問題なく動作します。

DB を初期化する文字列は次のとおりです。

config.setJdbcUrl(
"jdbc:mysql://" + cred.getHOST() + "/" + cred.getDB()
+ "?allowMultiQueries=true&characterEncoding=utf-8&useUnicode=true&rewriteBatchedStatements=true&relaxAutoCommit=true"
);

JDBC が突然このように動作するのはなぜですか?

4

1 に答える 1

1

ステートメントを次のように分割してみてください

a = "SET @report_model_id = 2; ";
b = "SELECT MAX(report_ts) AS report_ts " + 
"FROM `pulse_data`.`key_event_reports` " + 
"WHERE report_model_id = @report_model_id ";

そしてPreparedStatement.addBatch()、それぞれのために行います。

于 2013-06-07T17:41:13.660 に答える