在内存数据库中,使用hibernate并定期持久化到实际的db

时间:2014-01-10 21:26:32

标签: spring hibernate in-memory-database

我想在内存数据库中使用hibernate,所以我的查询非常快。 但另外我想定期坚持将内存状态转换为真正的mysql数据库。 当然,内存数据库应该在启动时从该mysql db加载其初始内容。 那个目的有没有好的框架/做法? (我使用spring)任何教程或指针都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我会诚实地对你说,大多数体面的数据库都可以被认为是内存到范围,因为它们会缓存数据并尽量不经常点击硬盘。根据我的经验,最好的内存数据库要么是高速缓存,要么是已经以其他形式保存的其他数据源的组合,然后以实时方式更新以获取时间关键信息,或者定期刷新非时间数据库 - 关键信息。

将数据从冷启动加载到内存可能是一个漫长的过程,但随后的查询将非常快。

如果您正在尝试缓存已经存在的内容,您可以查看内存缓存,但实际上内存数据库总是依赖于更持久的源代码,无论是MySQL,SQLServer,Cassandra,MongoDB,您都可以使用它。

所以你有点不清楚你想要实现什么,足以说它可以从持久数据库中获取数据并拥有大量的内存缓存,但你需要设计某些数据可以获得的陈旧程度,以及您需要多长时间点击真实来源以获得最新结果。

答案 1 :(得分:0)

实际上最简单的方法是使用一些核心Hibernate功能,使用hibernate Session本身并将其与二级缓存结合起来。

将要缓存的实体声明为@Cacheable

@Entity 
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NON_STRICT_READ_WRITE)
public class SomeReferenceData { ... }

然后执行定期刷新,假设您正在使用JPA:

  • 打开EntityManager
  • 使用该实体管理器加载要缓存的实体,而不是其他
  • 保持实体管理器打开,直到下一次定期刷新,Hibernate通过它的脏检查机制跟踪SomeReferenceData在内存中被修改的实例,但是没有发出修改查询。
  • 通过二级缓存
  • 阻止了对数据库的读取
  • 当冲洗会话时,只需开始一个事务并立即提交。
  • Hibernate将更新数据库中的已修改实体,更新二级缓存并恢复执行
  • 最终关闭实体管理器并将其替换为新实体管理器,如果要从数据库重新加载evey的话
  • 否则保持相同的实体经理

代码示例:

尝试使用此代码查看整体构思:

public class PeriodicDBSynchronizeTest {

    @Test
    public void testSynch() {

        // create the entity manager, and keep it
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("testModel");

        EntityManager em = factory.createEntityManager();

        // kept in memory due to @Cacheable
        SomeReferenceData ref1 = em.find(SomeReferenceData.class, 1L);
        SomeReferenceData ref2 = em.find(SomeReferenceData.class, 2L);
        SomeReferenceData ref3 = em.find(SomeReferenceData.class, 3L);  
        ....  

        // modification are tracked but not committed
        ref1.setCode("005");

        // these two lines will flush the modifications into the database
        em.getTransaction().begin();
        em.getTransaction().commit();

       // continue using the ref data, and tracking modifications until the next request
       ...
    }
}