【问题标题】:Load the whole database with Hibernate使用 Hibernate 加载整个数据库
【发布时间】:2012-12-13 14:59:45
【问题描述】:

我在 Java 中使用 SQLite3 和 Hibernate。我可以以某种方式将整个数据库加载到内存中或从数据库中获取所有数据,以便我可以最快地访问映射对象吗?例如,如果我们有一个 Company 和 Employee 类,并且在 Company 中,我们将Employees 映射为 company.getEmployees()。我想从数据库中获取所有公司,稍后当我调用此方法时,我想立即获取员工。那么有没有办法预加载它们?此外,如果员工被映射到其他对象,我也可以预加载它们吗?总而言之,我想加载整个数据库并使用 ORM 来访问数据。谢谢!

【问题讨论】:

    标签: java hibernate memory sqlite eager


    【解决方案1】:

    如果您的目标只是出色的性能,您有多种选择:

    • 配置休眠二级cache
    • 如果您的数据没有太大变化,请配置query cache
    • 在嵌入式模式下使用 HSQLDBH2 内存 SQL 数据库代替 SQLite
    • ObjectDB 与大型共享cache 一起使用。符合 JPA 的 OODB。
    • 使用 MongoDB。一种非常快速的内存 NoSQL 解决方案

    如果您不需要使用 SQL,我建议使用 ObjectDB。

    (编辑:删除了急切获取,添加了查询缓存。)

    【讨论】:

    • 我认为只执行第一步他会变得更好。我同意其余的,但如果它太努力,配置一个好的缓存会做得很好。
    【解决方案2】:

    将实体类中的所有关系设置为渴望。如果您使用的是 JPA 注释:

    public class Company{
    
    private List<Employee> employeeList;
    
    @ManyToMany(fetch = FetchType.EAGER)
    public List<Employee> getEmployeeList() {
            return employeeList;
        }
    }
    

    当您从数据库中检索公司时,这将自动获取所有员工。请注意,这可能会显着影响性能。

    【讨论】:

    • 你确定这不会在我每次调用 getEmployeeList 时都发出请求吗?
    • 完全可以,只要是同一个对象。只是好奇,你为什么要这样做?看看memcached,拥有内存数据库似乎是更好的方法
    • 因为我的数据库很小(~3 mb),我使用了存储在其中的每一位数据。谢谢!
    • 没问题!如果您认为问题已解决,请接受该问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2016-12-13
    • 1970-01-01
    • 2014-12-06
    • 2016-03-11
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多