首页 > 解决方案 > 为什么这段代码不能实现从数据库的备份副本恢复 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没有受到影响。我不知道为什么会这样,也不知道缺少什么,所以我希望能得到一些帮助。

标签: javaderby

解决方案


问题可能是,您只是在应该附加此名称引用的变量值的地方附加单词“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();
    }
  }

推荐阅读