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