Java DAO 缓存

标签 java database caching

我正在开发一个中型 Java 应用程序,由于缺乏经验,我遇到了一个小问题。

我有一个自定义 DAO,它从数据库中获取“文章”对象。我有 Article 类,DAO 有一个方法叫做 getArticle(int id),这个方法返回一个 ArticleArticle 有一个 Category 对象,我正在使用延迟加载。

因此,当我请求文章的类别时 (Article a = new Article(); a.getCategory();) Article 类获取 来自 DAO 的类别,然后返回它。

我现在想缓存它,所以当我多次请求一篇文章的类别时,数据库只被查询一次。

我的问题是:我应该把缓存放在哪里?我可以将它放在 Article 类中(在 DTO 中),也可以将它放在 DAO 类中。

你说呢?

最佳答案

My question is: where should I put that cache? I can put it on the Article class (in the DTO), or I can put it on the DAO class.

正如其他人所提到的,这听起来确实有点像重新发明轮子。但无论如何,让我们考虑这两种情况,以便您更好地理解 ORM 的工作原理。

如果您将类别存储在文章中,如果不同的文章访问相同的类别,将一次又一次地加载。

getCategory() {
   if( category == null ) { category = <load from DAO> }
   return category;
}

如果将其存储在 DAO 中,则所有具有相同类别的文章都将受益于缓存,但您需要注意在类别更改时更新缓存。 p>

saveCategory( Category c ) {
     cache.put( c.id, c ); 
     <save in database>
}

这种方法的问题在于 (1) 缓存可能会随着时间的推移而变大,并且 (2) 如果您没有超时机制或清除缓存的方法,数据库中的外部更新将永远不会反射(reflect)出来.

其实Hibernate等ORM有三级缓存:

  1. 实体本身。当类别被延迟加载时,它被存储在文章实体中以供后续直接访问。
  2. 一级缓存。这是当前 session /事务的缓存。同一个实体不会被加载两次,而是从缓存中获取。
  3. 二级缓存。这是所有 session /事务的缓存。它对应于在 DAO 中缓存值的选项。由于我上面提到的原因,二级缓存有时更棘手。

希望您能更好地了解每种缓存类型的缺点/优点。有关更多信息,请查看流行的 ORM 文档。这些问题很常见并且有据可查。

关于Java DAO 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815916/

相关文章:

c++ - 随着实体数量的增加,物理代码变得越来越慢

algorithm - Laravel5.2 中的缓存

java - Java 级 DNS 缓存的目的是什么?

java - 索取 LIMS 技术信息

java - '.class' 属性如何工作?

php - MyISAM 和 InnoDB 中的单个 mysql 语句是原子的吗?

php - 使用 2 台计算机处理一个项目

java - 如何在没有编译器警告的情况下使用泛型将 java.lang.Class 类型的变量初始化为 Collection?

java - 如何用Java制作倒计时器?

mysql - 如何删除列中位于两个确切单词之间的单词