Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重置/清除MySQL用户变量_Java_Mysql_Connection Pooling_User Variables - Fatal编程技术网

Java 重置/清除MySQL用户变量

Java 重置/清除MySQL用户变量,java,mysql,connection-pooling,user-variables,Java,Mysql,Connection Pooling,User Variables,我有很多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 prod

我有很多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
,这些表也不会被清除

在执行所需的查询之前,我可以手动逐个删除它们(
删除临时表x;
),但这可能会因为错误而发生

有没有一种方法(JDBC/MySQL、API/configuration)可以在不关闭数据库连接的情况下重置当前会话中创建的所有临时表(如您所知,我不是指
java.sql.connection.close()
),这样我仍然可以使用提供连接池的优势

编辑:


似乎只有从MySQL版本5.7.3开始,他们才开始改进“重置连接”功能。(发布说明:)但是,我暂时不使用它,因为5.7版仍在开发版本中

Q:有没有一种方法(JDBC/MySQL、API/configuration)可以在不关闭数据库连接的情况下重置当前会话中创建的所有临时表

A:否。没有可用的“重置”。您可以在会话中发出
DROP TEMPORARY TABLE foo
语句,但必须提供要删除的临时表的名称

标准模式适用于创建临时表以在连接返回到池之前删除它的进程。(我通常在
finally
块中处理此问题。)

如果我们预期其他进程可能会在会话中留下临时表(为了防御性,这就是我们所期望的),我们通常会在尝试创建临时表之前执行
删除临时表(如果存在foo

编辑

以上答案对于5.6版之前的MySQL是正确的

@Kame先生(OP)指出了新的
mysql\u reset\u连接
功能(在mysql 5.7.3中引入)

参考:

看起来这个新函数实现了与断开MySQL连接和重新连接MySQL几乎相同的结果,但开销更小


(现在我想知道MariaDB是否引入了类似的功能。)

Q:是否有一种方法(JDBC/MySQL、API/configuration)可以在不关闭数据库连接的情况下重置当前会话中创建的所有临时表

A:否。没有可用的“重置”。您可以在会话中发出
DROP TEMPORARY TABLE foo
语句,但必须提供要删除的临时表的名称

标准模式适用于创建临时表以在连接返回到池之前删除它的进程。(我通常在
finally
块中处理此问题。)

如果我们预期其他进程可能会在会话中留下临时表(为了防御性,这就是我们所期望的),我们通常会在尝试创建临时表之前执行
删除临时表(如果存在foo

编辑

以上答案对于5.6版之前的MySQL是正确的

@Kame先生(OP)指出了新的
mysql\u reset\u连接
功能(在mysql 5.7.3中引入)

参考:

看起来这个新函数实现了与断开MySQL连接和重新连接MySQL几乎相同的结果,但开销更小


(现在我想知道MariaDB是否引入了类似的功能。)

要么关闭连接让mysql自己清理,要么清理自己创建的每个变量/表。mysql中没有“将环境重置为最初的状态”功能。mysql 5.7.3中引入的
mysql\u reset\u connection
功能非常好。您可以通过关闭连接让mysql自行清理,也可以清理您自己创建的每个变量/表。mysql中没有“将环境重置为最初的状态”功能。mysql 5.7.3中引入的
mysql\u reset\u connection
功能非常好。我想知道这个功能,因为这些页面:。。。这涉及到一个新的“重置连接”数据包,并且。。。这是关于“ConnectionReset”池选项的。我会做更多的研究,然后在没有任何问题时将其标记为答案。我想知道这个功能,因为这些页面:。。。这涉及到一个新的“重置连接”数据包,并且。。。这是关于“ConnectionReset”池选项的。我会做更多的研究,如果没有发现任何问题,我会将此标记为答案。