关闭 UCanAccess 连接后无法删除数据库文件
Unable to delete database file after closing UCanAccess connection
我使用UCanAccess连接到临时Access文件读取数据,之后我想删除这些临时文件。但是,我总是得到 file.delete()=false
.
这是我的代码
public class JAccess {
static Connection conn;
static Statement stat;
public static void connect(String DBFilename) {
try {used ucanaccess to connect temporary access files
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String DataSource = "jdbc:ucanaccess://" + DBFilename;
String user = "user";
String pw = "pw";
conn = DriverManager.getConnection(DataSource, user, pw);
stat = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
} catch (Exception e) {
System.out.println(e);
}
}
public static void disconnect() {
try {
stat.close();
conn.close();
} catch (Exception e) {
System.out.println(e);
}
stat = null;
conn = null;
}
}
public void SelectTable(String DBFilename) throws SQLException {
JAccess.connect(DBFilename);
JAccess.disconnect();
}
public static void main(String[] args) throws SQLException {
.........
SelectTable(DBFilename);
File f = new File(DBFilename);
f.delete();
为什么 f.delete()
失败了?
默认情况下,UCanAccess 使用 immediatelyReleaseResources=false
打开与数据库文件的连接。在这种情况下,当 java.sql.Connection
关闭时,UCanAccess 实际上会将文件句柄和 HSQLDB 资源保持打开一小段时间,以防应用程序想要重新建立与数据库的连接。例如,对于为每个操作打开和关闭数据库连接的 ORM,可能会发生这种情况。但是,这也意味着无法在连接关闭后立即删除临时数据库文件,因为 UCanAccess 仍然打开着该文件。
如果我们在连接URL中指定immediatelyReleaseResources=true
那么UCanAccess会在java.sql.Connection
关闭后尽快关闭文件句柄并释放HSQLDB资源。这通常是 ETL 作业和其他需要 "one-shot" 连接到数据库文件的任务的首选行为。
我使用UCanAccess连接到临时Access文件读取数据,之后我想删除这些临时文件。但是,我总是得到 file.delete()=false
.
这是我的代码
public class JAccess {
static Connection conn;
static Statement stat;
public static void connect(String DBFilename) {
try {used ucanaccess to connect temporary access files
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String DataSource = "jdbc:ucanaccess://" + DBFilename;
String user = "user";
String pw = "pw";
conn = DriverManager.getConnection(DataSource, user, pw);
stat = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
} catch (Exception e) {
System.out.println(e);
}
}
public static void disconnect() {
try {
stat.close();
conn.close();
} catch (Exception e) {
System.out.println(e);
}
stat = null;
conn = null;
}
}
public void SelectTable(String DBFilename) throws SQLException {
JAccess.connect(DBFilename);
JAccess.disconnect();
}
public static void main(String[] args) throws SQLException {
.........
SelectTable(DBFilename);
File f = new File(DBFilename);
f.delete();
为什么 f.delete()
失败了?
默认情况下,UCanAccess 使用 immediatelyReleaseResources=false
打开与数据库文件的连接。在这种情况下,当 java.sql.Connection
关闭时,UCanAccess 实际上会将文件句柄和 HSQLDB 资源保持打开一小段时间,以防应用程序想要重新建立与数据库的连接。例如,对于为每个操作打开和关闭数据库连接的 ORM,可能会发生这种情况。但是,这也意味着无法在连接关闭后立即删除临时数据库文件,因为 UCanAccess 仍然打开着该文件。
如果我们在连接URL中指定immediatelyReleaseResources=true
那么UCanAccess会在java.sql.Connection
关闭后尽快关闭文件句柄并释放HSQLDB资源。这通常是 ETL 作业和其他需要 "one-shot" 连接到数据库文件的任务的首选行为。