4

我使用以下代码创建了内存数据库的备份:

public static void backUpDatabase(Connection conn)throws SQLException
{
String backupdirectory ="c:/mybackups/"+JCalendar.getToday();
CallableStatement cs = conn.prepareCall("CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)"); 
cs.setString(1, backupdirectory);
cs.execute(); 
cs.close();
System.out.println("backed up database to "+backupdirectory);
}

现在我想通过从以前的备份创建一个内存数据库来恢复数据库。我该怎么做?

谢谢。

4

2 回答 2

4

我知道的最快方法:

首先,使用shutdown=true

boolean gotSQLExc = false;
    try {
        DriverManager.getConnection("jdbc:derby:memory:testdb;shutdown=true");
    } catch (SQLException se) {
        if ( se.getSQLState().equals("08006") )
            System.out.println("Database shut down normally");
        else
            System.out.println("Database did not shut down normally")
    }

然后restoreFrom=

    Connection connection = DriverManager.getConnection("jdbc:derby:memory:testdb;restoreFrom=path/to/backup/file");
    connection.close();

一个包含约 300 个表的数据库,以这种方式在我的开发机器上以约 150 毫秒的时间恢复了一些示例数据。

这对于需要快速快速数据库恢复的 junit 集成测试非常有用。根据您的设置,您可能需要在测试之间执行一些额外的工作,例如,如果使用 c3p0 连接池,您需要从 C3P0Registry 获取所有连接并在此恢复后调用 hardReset()。另一方面,不需要对其他一些池进行任何操作。

于 2015-05-18T16:54:15.470 回答
3

据我所知,正常的从备份恢复机制可以很好地恢复内存数据库。因此,请在您的连接 URL 上使用 restoreFrom 子句,如下所述:http: //db.apache.org/derby/docs/10.9/adminguide/tadminhubbkup44.html

于 2012-08-08T21:38:51.817 回答