Java 删除JDBC创建的行李的正确方法?

Java 删除JDBC创建的行李的正确方法?,java,jdbc,h2,Java,Jdbc,H2,我正在编写一个Java程序,它遍历用户提供的目录下的所有内容,查找h2数据库并显示其内容。以下是我迄今为止编写的代码: private void openDatabase(File file) { try { Class.forName("org.h2.Driver"); Connection connection; try { connection = DriverManager.getConnection("jd

我正在编写一个Java程序,它遍历用户提供的目录下的所有内容,查找h2数据库并显示其内容。以下是我迄今为止编写的代码:

private void openDatabase(File file) {
    try {
        Class.forName("org.h2.Driver");
        Connection connection;
        try {
            connection = DriverManager.getConnection("jdbc:h2:" + file.getAbsolutePath());
            DatabaseMetaData md = connection.getMetaData();
            ResultSet resultSet = md.getTables(null, null, "%", null);
            while (resultSet.next()) {
                System.out.println("TABLE: " + resultSet.getString(3));
            }
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e2) {
                    e2.printStackTrace();
                }
            }
        }
    } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
    }
}
它做得很好-它找到
(db)
,并打印出其中的表格。只有一个问题。每次找到
(db)
,它都会创建
(db).h2.db
(db).trace.db
。这意味着,在我的程序的后续运行中,除了
(db)
之外,它还会查找并扫描这些内容。这没什么大不了的,除了在第三次运行时,它创建了
(db.h2.db.h2.db
(db.trace.db.h2.db
(db.h2.db.trace.db
,以及
(db.trace.db.trace.db
)。等等这是一个指数增长的问题


我做错了什么?如何防止它完全生成这些额外文件,或者在完成后使其自行清理?

对于H2数据库引擎,JDBC URL
JDBC:H2:/directory/test
表示数据库内容存储在文件
/directory/test.H2.db
中。这意味着,数据库URL与文件名完全匹配

因此,您可以不直接使用文件名,而是使用:

String fileName = file.getAbsolutePath();
if (!fileName.endsWith(".h2.db")) {
    // not a H2 database
    return;
}
String databaseName = fileName.substring(0, fileName.length() - ".h2.db".length());
String url = "jdbc:h2:" + databaseName;
帮助清理了大部分多余的文件,但他没有做的一件事是如何清理跟踪文件。我发现这解释了如何处理这些文件

您可以在连接URL中插入选项,以分号分隔。它们的形式为option\u key=option\u value。其中两个选项键是
TRACE\u LEVEL\u SYSTEM\u OUT
TRACE\u LEVEL\u FILE
。它们中的每一个都可以设置为0(关闭)、1(错误)、2(信息)或3(调试)

下面是我编写的代码的一个例外,它使用选项正确地打开数据库,不生成额外的.h2.db文件,不生成跟踪文件,并且信息进入系统日志:

String path = file.getAbsolutePath();
String url = "jdbc:h2:" + path.substring(0, path.length()-6); // jdbc:h2 doesn't like file extensions in the path - remove the .h2.db
String options = ";TRACE_LEVEL_FILE=0;TRACE_LEVEL_SYSTEM_OUT=2"; // put info on the console, not in a log file
Connection connection = DriverManager.getConnection(url + options);

奇怪的我想你可以用“.h2”或“.trace”过滤掉任何东西。谢谢!这解决了我没有提到的其他问题,比如SQL语句无法找到我知道在db中的表。我怀疑它正在生成新的数据库,然后在这些数据库上运行语句。只是问题的一小部分没有得到回答-如何防止它生成跟踪文件?这只是一个从数据库中提取一些ID和名称的小型诊断程序,它不需要执行任何连接或任何其他操作,因此我认为我不需要/不需要跟踪文件。跟踪文件:它包含什么?只有在出现异常或其他问题时才应该创建它。我不知道如何检查它,但我在跟踪功能上找到了以下文档:我添加了一个答案来弥补您遗漏的内容。