1

一時テーブルを使用して複雑で高価なクエリを小さな断片に分割する多数の MySQL クエリがあります。

create temporary table product_stats (
     product_id int 
    ,count_vendors int 
    ,count_categories int
    ,...
);

-- Populate initial values.
insert into product_stats(product_id) select product_id from product;

-- Incrementally collect stats info.
update product_stats ... join vendor ... set count_vendors = count(vendor_id);
update product_stats ... join category... set count_categories = count(category_id);
....

-- Consume the resulting temporary table.
select * from product_stats;

問題は、接続プールを使用しているため、 を閉じてもこれらのテーブルがクリアされないことjava.sql.Connectionです。

drop temporary table x;必要なクエリを実行する前に、それらを手動で ( ) 1 つずつ削除できますが、これはミスが原因で発生する可能性があります。

java.sql.Connection.close()データベース接続を閉じずに現在のセッション内で作成されたすべての一時テーブルをリセットする方法(JDBC/MySQL、API/構成) はありますか?接続プールを提供しますか?

編集:

MySQL バージョン 5.7.3 からのみ、「接続のリセット」機能の実装が開始されたようです。(リリースノート: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html ) ただし、バージョン 5.7 が残っているため、当面は使用しません。開発リリース。

4

1 に答える 1

0

Q:データベース接続を閉じずに、現在のセッション内で作成されたすべての一時テーブルをリセットする方法 (JDBC/MySQL、API/構成) はありますか?

A:いいえ。利用できる「リセット」はありません。DROP TEMPORARY TABLE fooセッション内でステートメントを発行できますが、削除する一時テーブルの名前を指定する必要があります。

規範的なパターンは、接続がプールに返される前に、一時テーブルを作成したプロセスがそれをドロップすることです。(私は通常、これをfinallyブロックで処理します。)

他のプロセスがセッションに一時テーブルを残す可能性があると予想される場合 (そして防御的であることが予想される場合)、通常DROP TEMPORARY TABLE IF EXISTS foo、一時テーブルを作成する前に a を実行します。

編集

上記の答えは、バージョン 5.6 までの MySQL に対して正しいです。

mysql_reset_connection@mr.Kame (OP) は、新しい関数 (MySQL 5.7.3 で導入) を指摘しています。

参照: 22.8.7.60 mysql_reset_connection() http://dev.mysql.com/doc/refman/5.7/en/mysql-reset-connection.html

この新しい関数は、MySQL から切断して再接続することによって得られる結果とほぼ同じ結果を達成するように見えますが、オーバーヘッドは少なくなります。

(今、MariaDB が同様の機能を導入したかどうか疑問に思っています。)

于 2015-06-23T21:05:31.820 に答える