hibernate/hsqldb:关机后找不到数据库文件

Posted

技术标签:

【中文标题】hibernate/hsqldb:关机后找不到数据库文件【英文标题】:hibernate/hsqldb: Database file not found after shutdown 【发布时间】:2017-02-05 12:14:15 【问题描述】:

当我关闭休眠数据连接时,仍然存在一个锁定文件。

这是我尝试过的:

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class TestEntity 

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    @Column public String name = "";

    public TestEntity()  


public class TestWhyNotUnlockDatabase 

    public static void main(String[] args) throws Exception 

            Map<String, String> connProp =      new HashMap<String,String>();
            connProp.put("javax.persistence.jdbc.url","jdbc:hsqldb:file:\\Users\\Bernd\\.mld\\0.2\\solala.db;shutdown=true");
            connProp.put("javax.persistence.schema-generation.database.action", "none");

            System.out.println("Creating DB");
            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("WhyNotUnLock",connProp);
            EntityManager entityManager = entityManagerFactory.createEntityManager();

            System.out.println("persisting");
            entityManager.getTransaction().begin();
            entityManager.persist(new TestEntity());
            entityManager.getTransaction().commit();

            System.out.println("closing");
            entityManager.clear();
            entityManager.close();
            entityManagerFactory.close();
            System.out.println("DB closed");
    


输出如预期:

Creating DB
WARN   2017-02-36 12:59:29  [main] org.hibernate.orm.connections.pooling - HHH10001002: Using Hibernate built-in connection pool (not for production use!)
persisting
closing
DB closed

但是程序执行结束后,这里只有以下文件:

solala.db.properties
solala.db.script

我的问题:

我原以为数据存储在一个名为solala.db 的文件中,但我找不到这个。数据库文件在哪里?

其他一些奇怪的观察:我在 Windows Eclipse IDE(Neon.2 Release (4.6.2))中执行此操作。运行此程序并退出 Exclipse 后,Eclipse 将无法再启动。没有给出错误信息。只有重新安装 Eclipse 有帮助(重新启动是不够的)。似乎在这个程序结束后仍有一些人工制品。

其他信息 主要部分在persitence.xml:

<persistence-unit name="WhyNotUnLock"   transaction-type="RESOURCE_LOCAL">

        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>masterlist.trials.TestEntity</class>


         <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>
             <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
            <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />        
            <property name="javax.persistence.jdbc.user" value="SA" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file://C:\\Users\\Bernd\\.mld\\0.1\\smallDB.db"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />

            <property name="hibernate.max_fetch_depth" value="3" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />

            <property name="hibernate.max_fetch_depth" value="3" />
            <property name="hibernate.hbm2ddl.auto" value="create" />

            <!-- Echo all executed SQL to stdout -->
            <property name="hibernate.show_sql" value="false" />
            <property name="javax.persistence.schema-generation.database.action" value="none"/>


        </properties>
    </persistence-unit>

以及我在build.gradle 中的依赖项:

compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.6.Final'
compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '5.2.6.Final'
compile group: 'org.hibernate', name: 'hibernate-validator', version: '5.4.0.CR1'
compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final' 
compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '5.2.6.Final' 
compile 'com.enigmabridge:hibernate4-sqlite-dialect:0.1.2'

编辑 1(不重复)

有人建议此问题与enter link description here 重复。我看了这个答案。不幸的是,我无法从这个链接中得到答案。在这个链接中,作者想要一个内存数据库,所有文件在关机后都会被删除。相反,我希望数据库文件在应用程序关闭后保持不变。

编辑 2 (shutdown=true)

选项shutdown=true 已添加到代码中。现在解除锁定。无论如何,数据库文件仍然丢失。修改了问题的标题。

【问题讨论】:

HSQLDB inmemory mode doesn't delete files on shutdown的可能重复 感谢 Naros 提供的链接。不幸的是,我无法得出结论这如何帮助我解决问题。在您的链接中考虑了一个内存数据库,而我希望数据在关闭后保留在一个(未查看的)文件中。 (信息也包含在我的问题的编辑中。) 好的。我现在了解到 HSQLDB 将完整信息存储在 ASCII 格式的 *.script 文件中。我做对了吗?对我来说,这有点令人惊讶,因为密码检查可能很容易被用户操纵。此外,在我看来,就大小和性能而言,它并不是一种非常有效的数据存储方式。有没有办法强制 HSQLDB 以二进制格式存储数据? 好的。在***.com/questions/13432262/… 找到答案 【参考方案1】:

部分回答: 设置shutdown=true 删除了临时文件和锁定文件:

connProp.put("javax.persistence.jdbc.url","jdbc:hsqldb:file:\\Users\\Bernd\\.mld\\0.2\\solala.db;shutdown=true");

不仅剩下两个文件:

solala.db.properties
solala.db.script

我还在寻找solala.db

【讨论】:

这两个文件是数据库。如果没有 CACHED 表,则不存在其他文件。 谢谢弗雷特。现在就明白了。

以上是关于hibernate/hsqldb:关机后找不到数据库文件的主要内容,如果未能解决你的问题,请参考以下文章

node.js安装后可以使用,关机再开在使用语法就找不到了

Hibernate/hsqldb 2 无法水合 Blob 列

确保更新发生在 Hibernate/HSQLDB 中的并发锁定?

使用本机 SQL 创建表适用于 Hibernate/HSQLDB,插入失败。为啥?

JPA/Hibernate/HSQLDB 查询但不分配子对象

虚拟机安linux没安完关机(虚拟机关机)后找不着了,怎么删了它