我想在内存数据库中使用hibernate,所以我的查询非常快。 但另外我想定期坚持将内存状态转换为真正的mysql数据库。 当然,内存数据库应该在启动时从该mysql db加载其初始内容。 那个目的有没有好的框架/做法? (我使用spring)任何教程或指针都会有所帮助。
答案 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:
代码示例:
尝试使用此代码查看整体构思:
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
...
}
}