Reset/clear MySQL 用户变量
Reset/clear MySQL user variables
我有一堆 MySQL 查询使用临时表将 complex/expensive 查询分成小块。
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;
),但这可能会发生错误。
有没有办法(JDBC/MySQL,API/configuration)在不关闭数据库连接的情况下重置当前会话中创建的所有临时表(如你所知,我不是在引用java.sql.Connection.close()
), 这样我还能利用提供连接池的优势?
已编辑:
他们似乎只从 MySQL 版本 5.7.3 开始实施 "reset connection" 功能。 (发行说明:https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html)但是,我暂时不会使用它,因为 5.7 版仍处于开发版本中。
问:有没有办法(JDBC/MySQL,API/configuration)重置当前会话中创建的所有临时tables不关闭数据库连接。
A: 没有。没有 "reset" 可用。您可以在会话中发出 DROP TEMPORARY TABLE foo
语句,但您必须提供要删除的临时 table 的名称。
规范模式是为创建临时 table 的进程删除它,在 连接返回池之前。 (我通常在 finally
块中处理它。)
如果我们期望其他进程可能会在会话中留下临时 tables(并且为了防御,这正是我们所期望的),我们通常会在尝试创建一个 DROP TEMPORARY TABLE IF EXISTS foo
之前执行一个 DROP TEMPORARY TABLE IF EXISTS foo
临时 table.
编辑
上面的答案对于 MySQL 到 5.6 版都是正确的。
@mr.Kame (OP) 指出了新的 mysql_reset_connection
函数(在 MySQL 5.7.3 中引入)。
看起来这个新函数实现的结果与我们通过断开连接并重新连接到 MySQL 获得的结果几乎相同,但开销更少。
(现在我想知道MariaDB是否引入了类似的功能。)
我有一堆 MySQL 查询使用临时表将 complex/expensive 查询分成小块。
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;
),但这可能会发生错误。
有没有办法(JDBC/MySQL,API/configuration)在不关闭数据库连接的情况下重置当前会话中创建的所有临时表(如你所知,我不是在引用java.sql.Connection.close()
), 这样我还能利用提供连接池的优势?
已编辑:
他们似乎只从 MySQL 版本 5.7.3 开始实施 "reset connection" 功能。 (发行说明:https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html)但是,我暂时不会使用它,因为 5.7 版仍处于开发版本中。
问:有没有办法(JDBC/MySQL,API/configuration)重置当前会话中创建的所有临时tables不关闭数据库连接。
A: 没有。没有 "reset" 可用。您可以在会话中发出 DROP TEMPORARY TABLE foo
语句,但您必须提供要删除的临时 table 的名称。
规范模式是为创建临时 table 的进程删除它,在 连接返回池之前。 (我通常在 finally
块中处理它。)
如果我们期望其他进程可能会在会话中留下临时 tables(并且为了防御,这正是我们所期望的),我们通常会在尝试创建一个 DROP TEMPORARY TABLE IF EXISTS foo
之前执行一个 DROP TEMPORARY TABLE IF EXISTS foo
临时 table.
编辑
上面的答案对于 MySQL 到 5.6 版都是正确的。
@mr.Kame (OP) 指出了新的 mysql_reset_connection
函数(在 MySQL 5.7.3 中引入)。
看起来这个新函数实现的结果与我们通过断开连接并重新连接到 MySQL 获得的结果几乎相同,但开销更少。
(现在我想知道MariaDB是否引入了类似的功能。)