无法使用 java 使用 Backup.execute 备份我的 h2 数据库

Posted

技术标签:

【中文标题】无法使用 java 使用 Backup.execute 备份我的 h2 数据库【英文标题】:can not backup my h2 database with Backup.execute using java 【发布时间】:2019-08-23 12:46:09 【问题描述】:

我想使用 Backup.execute("name.zip", "./data","mydb", true ) 备份 h2 数据库文件,但出现以下错误:java.io.IOException: The process cannot access the file因为另一个进程锁定了文件的一部分。

我尝试关闭 EntityManager em (em.close()) 和 EntityManagerFactory emf (emf.close()) 然后删除文件但仍然出现相同的错误。我试图从 mainForm 中删除 @persistencecontext 但仍然遇到同样的错误。这是我的代码:

我所有的代码都在这里: can not delete my h2 database files with DeleteDbFiles.execute using java

【问题讨论】:

【参考方案1】:

对于这种误解,我深表歉意。您错过的是参数的顺序。应该如下所示。

Backup.execute("/location/of/backup/file" + "/backup.zip", "./data", "yourdbname", true);

【讨论】:

这不是真的,H2有在线备份命令。 h2database.com/html/commands.html#backup 您说在您的答案的第一个版本中使用数据库时无法进行备份。不正确,只有备份工具在使用数据库时不能使用。 BACKUP 命令 需要具有 ADMIN 权限的活动连接,并且可以改为使用它。针对不同的用例有不同的工具。 您编辑的答案是正确的,因为它明确提到不能使用 工具。并不是说不能在线备份了。 它也不允许我删除数据库文件:***.com/questions/57546917/… 如何关闭主应用程序然后进行备份?【参考方案2】:

只需更改我的 persistence.xml 内容,如下所示,然后在备份之前关闭 EntityManagerFactory。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">
<persistence-unit name="NewPersistenceUnit">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>model.MycardsEntity</class>
    <class>model.PeymentsEntity</class>
    <class>model.WorkersEntity</class>
    <class>model.YourcardsEntity</class>
    <class>model.LoginEntity</class>
    <properties>
        <property name="hibernate.connection.url" value="jdbc:h2:file:./data/mydata;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=NO"/>
        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
        <property name="hibernate.connection.username" value=""/>
        <property name="hibernate.connection.password" value=""/>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hbm2ddl.auto" value="update"/>
    </properties>
</persistence-unit>

现在可以使用此代码进行备份:

        emf.close();
    try 
        Backup.execute("./backup/name.zip", "./data", "mydb", true);
        System.out.println("done");
     catch (SQLException e) 
        e.printStackTrace();
    

【讨论】:

以上是关于无法使用 java 使用 Backup.execute 备份我的 h2 数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Maven 编译简单的 Java 10 / Java 11 项目

无法使用java连接到mysql数据库[重复]

无法使用 TPTP 分析远程 Java 应用程序

java.sql.SQLException:无法使用 executeQuery() 发出数据操作语句。 23

无法使用 java 连接到 HTTPS url

无法使用 java 插入视频 youtube