Java 为什么这段代码不能实现从数据库的备份副本恢复Derby数据库的目标?
我有一个访问嵌入式Derby数据库的JavaFXML应用程序。数据库存储在此文件子系统中: 目录Java 为什么这段代码不能实现从数据库的备份副本恢复Derby数据库的目标?,java,derby,Java,Derby,我有一个访问嵌入式Derby数据库的JavaFXML应用程序。数据库存储在此文件子系统中: 目录db包含常用的Derby文件和目录: 图1中的备份目录是用户可以从应用程序GUI创建的db的副本。例如: 我想要实现的是能够从GUI中选择一个备份文件,并替换db中包含的当前数据库。我已通过手动删除db并将其替换为备份来验证这些备份的完整性 尝试实现目标的准则是: public class NdBkp { private static Connection conn = null;
db
包含常用的Derby文件和目录:
图1中的备份目录是用户可以从应用程序GUI创建的db
的副本。例如:
我想要实现的是能够从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
也没有受到影响。我不知道这是为什么,也不知道遗漏了什么,因此我希望能得到一些帮助。尝试使用此代码以尽量减少行数,并发现错误:
public class Restore {
public void restoreDatabaseRoutine() {
String restoreUrl = "jdbc:derby:Test;restoreFrom=/path/to/another/db";
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
Class.forName(driver);
Connection conn = DriverManager.getConnection(restoreUrl);
conn.close();
System.out.println("The database has been successfully restored");
}
}
问题可能是,您只是在“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();
}
}
catch(SQLException | NullPointerException sqle){return false;}
?真的吗?@SeelenVirtuse谢谢你的评论。我不太明白它是如何帮助我解决这个问题的。请说明。您正在捕获指示问题的异常。打印堆栈跟踪@是的,我错过了一次很糟糕的比赛。但是,添加的打印堆栈跟踪显示在代码运行时没有引发异常。。。可能是这样。你的代码什么都不做!你期待什么?我想是时候调试了……方法签名中的字符串地址的目的是什么?