Java H2不删除临时表的序列

Java H2不删除临时表的序列,java,sql,h2,Java,Sql,H2,我有一个应用程序,我使用H2临时表来存储大型缓存。但当我关闭所有连接并关闭数据库时,表的顺序并没有被删除。过了一段时间,我有这么多随机名字泄漏序列 问题: 是否按设计不删除临时表的序列 我怎样才能知道任何表都没有使用具体的顺序,这样我就可以删除该顺序 下面是简单的junit4测试: import org.junit.Test; import java.io.File; import java.sql.*; import static org.junit.Assert.assertEqua

我有一个应用程序,我使用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
语句,并检查(通过正则表达式匹配)序列是否被引用。

谢谢,Thomas。我会看看我还可以使用哪些选项。对我来说,解析脚本nodata输出是一件过分的事情。也许我可以手动生成主键。。。