0

次のようなルーチンを使用して、データベースに情報を保存しています。

try{
connection = cpds.getConnection();
pstmt = connection.prepareStatement("select setSomeData(?,?)");
//set data to the statement
res = pstmt.executeQuery();
//process data retrieved
} catch (SQLException ex) {
        System.out.println("SQLException: " + ex);
        ex.printStackTrace();
        return null;
    } finally {
        try {
            pstmt.close();
            connection.close();
        } catch (SQLException ex) {
    }
}

しかし、時々私はこの例外を受けています:

SQLException: com.mysql.jdbc.MysqlDataTruncation: データの切り捨て: '(tstmp@5 - lastEvent@11)' の
BIGINT UNSIGNED 値が範囲外です com.mysql.jdbc.MysqlDataTruncation: データの切り捨て: BIGINT UNSIGNED 値が範囲外です'(tstmp@5 - lastEvent@11)' の
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
の com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2066)
の com.mysql .jdbc.MysqlIO.nextRow(MysqlIO.java:1922)
com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3414)
com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:481)
com. mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3120)
com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2288)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2709)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2134 ) ) com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:116) で
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2300 )

影響を受ける列や保存しようとしている値など、例外に関する詳細情報を知ることは可能ですか?

たとえば、例外の場合:.MySQLTransactionRollbackException: Deadlock found when trying to get lock;

クエリSHOW ENGINE INNODB STATUSは非常に便利です...

4

1 に答える 1

1

SQLSTATE、および対応する MySQL エラー コードとメッセージ以外に、JDBC を介して入手できるデバッグ情報はほとんどありません。

https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html


最初の例外については、UNSIGNED 整数データ型に負の値を格納しようとしたときに MySQL によって警告 (またはエラー) が発生したことが原因である可能性が最も高いと考えられます。

例として:

CREATE TABLE foo (val BIGINT UNSIGNED);
INSERT INTO foo (val) VALUES (-4);

0 row(s) affected
Total Time     : 0.030 sec
--------------------------------------------------

1 row(s) affected, 1 warning(s)
Total Time     : 0 sec

Warning Code : 1264
Out of range value for column 'val' at row 1

他の例外については、これは発生している MySQL エラーに関する情報です。

Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)
Message: Deadlock found when trying to get lock; try restarting transaction

InnoDB テーブルで発生したエラーについては、はい、SHOW ENGINE INNODB STATUSステートメントからの出力から何らかの洞察が得られます。ただし、その情報はデータベース全体に関するものであり、必ずしもエラーが発生したセッションに固有のものではありません。

于 2013-01-16T17:13:39.167 に答える