gpt4 book ai didi

java - H2 不删除临时表的序列

转载 作者:行者123 更新时间:2023-11-30 11:17:15 26 4
gpt4 key购买 nike

我有一个应用程序,我在其中使用 H2 临时表来存储大型缓存。但是当我关闭所有连接并关闭数据库时,我的表的序列不会被删除。一段时间后,我有很多带有随机名称的泄漏序列。

问题:

  • 不丢弃临时表的序列是设计使然吗?

  • 我如何确定具体序列未被任何表使用,以便我可以删除该序列?

这是简单的 junit4 测试:

import org.junit.Test;

import java.io.File;
import java.sql.*;

import static org.junit.Assert.assertEquals;

public class H2Test {
String databaseUrl = "jdbc:h2:./SST;";
String userName = "sa";
String password = "";
@Test
public void tempTableTest() throws Exception {
Class.forName("org.h2.Driver");
File databaseFile = new File("./SST.mv.db");
if(databaseFile.exists()){
databaseFile.delete();
}

assertCount("SELECT count(*) FROM INFORMATION_SCHEMA.SEQUENCES", 0);
assertCount("SELECT count(*) FROM INFORMATION_SCHEMA.TABLES where table_name = 'SST'", 0);

try (Connection connection = DriverManager.getConnection(databaseUrl, userName, password)) {
execute(connection, "CREATE CACHED LOCAL TEMPORARY TABLE SST ( id BIGINT IDENTITY, value VARCHAR(2048) NULL)");
execute(connection, "INSERT INTO sst(value) VALUES('some value')");
execute(connection, "SHUTDOWN");
}

assertCount("SELECT count(*) FROM INFORMATION_SCHEMA.TABLES where table_name = 'SST'", 0);
assertCount("SELECT count(*) FROM INFORMATION_SCHEMA.SEQUENCES", 0);
}

private void assertCount(String query, int count) throws SQLException {
try (Connection connection = DriverManager.getConnection(databaseUrl, userName, password) ) {
try (Statement st = connection.createStatement()) {
ResultSet resultSet = st.executeQuery(query);
resultSet.next();
assertEquals(count, resultSet.getInt(1));
execute(connection, "SHUTDOWN");
}
}
}

public void execute(Connection connection, String statement) throws SQLException {
try (Statement st = connection.createStatement()) {
st.execute(statement);
}
}
}

最佳答案

这是 H2 数据库中的错误。它将在 H2 版本 1.4.180 中修复。临时表的序列不应存储在数据库文件中。它们实际上不会被存储,直到它们被第一次使用(在您的情况下作为 insert 语句的一部分)。

如果您想手动删除序列,您可以检查它是否在任何表中被引用。一种方法是运行 script nodata 语句,并检查(通过正则表达式匹配)序列是否被引用。

关于java - H2 不删除临时表的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24475683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com