0

私の質問の短いバージョンは次のとおりです。

PreparedStatement ps;
ps = connection.prepareStatement("Insert into T values (?)");
ps.setBoolean(1, true);
ps.executeUpdate();

このコード サンプルで値が引用符で囲まれたクエリが生成される理由は何ですか?

私の質問の長いバージョンは次のとおりです。

MySQLDataTruncationDB インタラクション用にプレーンな JDBC を使用する JavaEE アプリケーションを使用していますが、最近、ログにいくつかの例外が表示されることに気付きました。これらの例外は、ブール列が として定義されている DB テーブルにエンティティを保存しようとしたときに発生していましたBIT(1)。そして、生成されたクエリが次のようになったためです。

Insert into T values ('1');

値は引用符で囲まれていることに注意してください。クエリは、Log4Jlog.info(ps);ステートメントを使用してアプリケーションからログに記録されました。以前のログは、引用符がない場所を示しています。

さらに、MySQL サーバーのログも異なって見えるようになりました。これが発生する前に、実行された各クエリに対してレコードのペアを指定していました。

12345 Prepare Insert into T values (?)
12345 Execute Insert into T values (1)

以降:

12345 Query Insert into T values ('1')

これらの変更は、新しいバージョンのアプリケーションをデプロイしたり、MySQL/アプリケーション サーバーを再起動したりした結果ではないことに注意してください。クエリ生成を担当するコードは、この質問の例と同じくらい簡単です。

アプリケーション サーバーを再起動すると、問題が約 12 時間修正された後、再び発生しました。一時的な解決策として、BIT列を次のように変更しましたTINYINT

PS アプリケーションと MySQL の両方のログを調べると、問題が発生した時間帯を約 2 分に絞り込むことができましたが、この期間のログには異常はありませんでした。

PPS アプリケーション サーバーは Glassfish 2.1.1、MySQL サーバーのバージョンは 5.5.31-1~dotdeb、MySQL Connector/J のバージョンは 5.0.3 です。

4

1 に答える 1

0

実際には、閉じられていない準備済みステートメントの問題であることが判明しました。MySQL サーバーで開かれたステートメントの数が許容最大値に達したとき、アプリケーションは SQL エラーを生成することなく、何らかの形で作業を続行できました。

Error Code: 1461 Can’t create more than max_prepared_stmt_count statements

しかし、そのモードでは、ブール値を引用符で囲み始めたため、BIT(1) 列に影響を与えるすべての問題が発生しました。

于 2013-10-25T09:32:15.047 に答える