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

标签 java jdbc h2

我正在编写一个 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;

关于java - 删除 JDBC 创建的行李的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108354/

相关文章:

java - 日志文件中的常见日期时间格式

java - Java 中的 `x > 0` 和 `x > 0.0D` 之间有什么区别吗?

java - JFrame 显示不正确

mysql - mysql 上的 Grails 事务 setSavePoint 方法导致异常

hadoop - [Simba][ImpalaJDBCDriver](500051) 处理查询/语句时出错

playframework - 使用 h2-browser 访问 Play 项目数据库

java - 创建一个可以充当另一个类的类

java - Apache Ivy : Restrict Publishing to a Repository

java - H2:如何创建不带参数的存储过程

java - H2 服务器在调试时挂起