java - 为什么这段代码不能实现从数据库的备份副本恢复 Derby 数据库的目标?
问题描述
我有一个访问嵌入式 Derby 数据库的 JavaFXML 应用程序。数据库存储在这个文件子系统中:
该目录db
包含常用的 Derby 文件和目录:
图 1 中的 Backups 目录是db
用户可以从应用程序 GUI 创建的副本。例如:
我想要实现的是能够从 GUI 中选择一个备份文件并替换db
. db
我已经通过手动删除并用备份替换它们来验证这些备份的完整性。
尝试实现目标的代码是:
public class NdBkp
{
private static Connection conn = null;
public final static String SETUP_FILE_PATH = "/AppData/Local/NewdawnTest_old/";
public static final String CONNECTION_URL = "jdbc:derby:" + "C:/Users/" + System.getenv("USERNAME") + SETUP_FILE_PATH + "db";
public static final String BACKUP_FILE_PATH = "C:/Users/" + System.getenv("USERNAME") + SETUP_FILE_PATH + "Backups";
public static void connect() {
try {
// conn = DriverManager.getConnection(CONNECTION_URL + ";create=true");
conn = DriverManager.getConnection(CONNECTION_URL);
}
catch (SQLException e) {
e.printStackTrace();
}
}
public static void commit(){
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static boolean isConnected() {
try{
System.out.println("");
return (!(conn.isClosed()));
}
catch (SQLException | NullPointerException e){
e.printStackTrace();
return false;
}
}
public static void disconnect() {
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void backUpDatabase(String dirname) {
try {
CallableStatement cs = conn.prepareCall("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)");
cs.setString(1, BACKUP_FILE_PATH + "/" + dirname);
cs.execute();
cs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void restoreDatabase(String backupdirpath) {
System.out.println("Restoring " + CONNECTION_URL + " from + " + backupdirpath);
try {
DriverManager.getConnection(CONNECTION_URL + ";restoreFrom=backupdirpath");
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main (String [] args)
{
String backupdirpath = "C:/Users/Administrator/AppData/Local/NewdawnTest_old/Backups/20200515_bkp_02";
connect();
restoreDatabase(backupdirpath);
System.out.println("Is connected is " + isConnected());
disconnect();
System.out.println("Is connected is " + isConnected());
}
}
当我编译并运行这段代码时,一切似乎都正常。没有错误转储或任何指示restoreDatabase
方法中定义的请求的操作没有工作。但是当我查看文件系统时,实际上什么都没有发生,并且当前版本db
没有受到影响。我不知道为什么会这样,也不知道缺少什么,所以我希望能得到一些帮助。
解决方案
问题可能是,您只是在应该附加此名称引用的变量值的地方附加单词“backupdirpath”?
public static void restoreDatabase(String backupdirpath) {
System.out.println("Restoring " + CONNECTION_URL + " from + " + backupdirpath);
try {
// I think this:
DriverManager.getConnection(CONNECTION_URL + ";restoreFrom=backupdirpath");
// should be this:
//DriverManager.getConnection(CONNECTION_URL + ";restoreFrom=" + backupdirpath);
} catch (SQLException e) {
e.printStackTrace();
}
}
推荐阅读
- java - 向 JSON 结构添加更改
- r - 如何在您定义的函数中使用 Python 模块的函数而不导入超出函数的范围(即:R 具有 package::function)
- java - Spring Boot 控制器测试,空指针异常
- c++ - 如何比较if语句中的字符串?
- java - 使用 com.ibm.websphere.crypto.PasswordUtil.decode 时出现 InvalidPasswordCipherException
- python - 如何在python中找到几种类型的最新共同祖先(基本类型)?
- ios - IOS 13 自动化要求运行
- javascript - 内存中的 ReactJS 虚拟 DOM 并应用增量更改
- javascript - 在 Nightwatch 中选择 tabindex
- c - 如何在装配循环后转移控制?