`
jiming
  • 浏览: 274144 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

讨论一下 cache 应该放在 service 层还是 dao 层吧

    博客分类:
  • java
阅读更多
我个人倾向于放在 service 层。

因为虽然 hibernate 和 iBatis 都提供了 cache 机制,但是他们提供的方式都不是很完善。而且还有可能会使用其它 dao 的技术方案。所以放在 service 层应该更好一些。

注: cache 话题很大,我们只讨论 business layer 的 cache 问题,即 service 和 DAO。
分享到:
评论
10 楼 retreat 2007-02-08  
引用
所以我的原则是,只在一个层面上提供 cache 功能,其它的层面都不提供,以避免其复杂性并且降低耦合性。


1:如果在表现层+层Proxy来cache对象是非常细粒度的!但是缺乏包装!偶合度太高!
2:如果在业务逻辑层来cache,影响太大!我通常写一串cachedDao类来!(不是好的解决办法)

但是2者相比还是Dao层好一点!



请教是否可以采用
9 楼 JAVA_ED 2007-02-08  
jiming 写道
JAVA_ED 写道

LZ应该是指数据层的CACHE
最简单的一个HashMap Cache<Id, Object>, 或者<Sql, Object>
我不觉得数据访问层的CACHE放在SERVICE层会有额外的benefit
除非你要CACHE的是DOAMIN OBJECT

SERVICE需要的是DAO的服务 并不care你是从DB还是Cache去取得数据
可以通过比如AOP或者一个Decorate去配置Cache以对上层调用保持透明


对,我说的就是数据层的 cache,使用 aop 也需要考虑应该放在哪一层。Decorate 的方案就不在考虑范围内了,因为 pojo/dao/service,包括接口是实现类已经太多的类了。不想再添加新的类进去了。

在 service 层中实现的 cache 对上层应用也是透明的。

你认为AOP是layer-related吗?
Decorate模式并不会加重你开发或维护的负担 担心代码量只是一种pretense
getBusinessObject(){getCachedObject();} 这是一种透明吗
8 楼 jiming 2007-02-08  
JAVA_ED 写道

LZ应该是指数据层的CACHE
最简单的一个HashMap Cache<Id, Object>, 或者<Sql, Object>
我不觉得数据访问层的CACHE放在SERVICE层会有额外的benefit
除非你要CACHE的是DOAMIN OBJECT

SERVICE需要的是DAO的服务 并不care你是从DB还是Cache去取得数据
可以通过比如AOP或者一个Decorate去配置Cache以对上层调用保持透明


对,我说的就是数据层的 cache,使用 aop 也需要考虑应该放在哪一层。Decorate 的方案就不在考虑范围内了,因为 pojo/dao/service,包括接口是实现类已经太多的类了。不想再添加新的类进去了。

在 service 层中实现的 cache 对上层应用也是透明的。
7 楼 JAVA_ED 2007-02-08  
jiming 写道
我个人倾向于放在 service 层。

因为虽然 hibernate 和 iBatis 都提供了 cache 机制,但是他们提供的方式都不是很完善。而且还有可能会使用其它 dao 的技术方案。所以放在 service 层应该更好一些。

注: cache 话题很大,我们只讨论 business layer 的 cache 问题,即 service 和 DAO。


LZ应该是指数据层的CACHE
最简单的一个HashMap Cache<Id, Object>, 或者<Sql, Object>
我不觉得数据访问层的CACHE放在SERVICE层会有额外的benefit
除非你要CACHE的是DOAMIN OBJECT

SERVICE需要的是DAO的服务 并不care你是从DB还是Cache去取得数据
可以通过比如AOP或者一个Decorate去配置Cache以对上层调用保持透明
6 楼 LargeBean 2007-02-08  
:(
级别不够。。。。看不懂。。。。
5 楼 jiming 2007-02-08  
Cache 这个东西,看似简单,但是具体实施起来却是很麻烦,有许多方面的因素需要考虑,很多实施不好的 cache 会成为系统故障和维护噩梦的重要源头。

所以我的原则是,只在一个层面上提供 cache 功能,其它的层面都不提供,以避免其复杂性并且降低耦合性。

就像各位所讲到的那样,cache 包括很多层面,而且会有一些特殊情况,这些应改需要根据具体情况具体分析了。这里我主要想讨论一下我们大多数情况下用到的的 cache 方案。页面 cache 也很重要,不过不再这里讨论了。

Allen 说:
引用

首先,你所说的cache应该指的就是对象的缓存,确切地说应该是持久化对象的缓存。那么这个“service 层的object cache”肯定得由你们自己来写了,我想这很难保证你们的cache使用效果会比底层下面“不是很完善的”hibernate 和 iBatis 提供的cache更好看。

这个说的非常对,实现自己的缓存方案比较麻烦一点,但并不是非常困难的事情,而且一个方案定下来之后可以不断地重用。

Allen 说:
引用

再者,你们怎么保证“service 层的object cache”可以完好地与各不相同的“其它 dao 的技术方案”匹配上呢?而且又用什么机制保证“service 层的object cache”和数据库是同步的呢?直接连DB来获得更新了的碎片?或者专门写一些DAO层的接口,通过各自的实现来搞?

我的想法是 DAO 只做 DAO 的工作,对开发应用的程序员提供的接口只有 service,不允许直接操作 DAO。这样应该就可以实现了。





4 楼 giscat 2007-02-08  
个人认为cache拿到前端控制比较好
每一层都放容易混乱
在表现层和service层,比较好控制,容易管理
前端控制,前面的口袋扎好就行了





3 楼 Allen 2007-02-08  
jiming 写道
我个人倾向于放在 service 层。

因为虽然 hibernate 和 iBatis 都提供了 cache 机制,但是他们提供的方式都不是很完善而且还有可能会使用其它 dao 的技术方案。所以放在 service 层应该更好一些。


首先,你所说的cache应该指的就是对象的缓存,确切地说应该是持久化对象的缓存。那么这个“service 层的object cache”肯定得由你们自己来写了,我想这很难保证你们的cache使用效果会比底层下面“不是很完善的”hibernate 和 iBatis 提供的cache更好看。

再者,你们怎么保证“service 层的object cache”可以完好地与各不相同的“其它 dao 的技术方案”匹配上呢?而且又用什么机制保证“service 层的object cache”和数据库是同步的呢?直接连DB来获得更新了的碎片?或者专门写一些DAO层的接口,通过各自的实现来搞?

对于这个想法,我的第一感觉就是:not nice enough but naive enough
2 楼 Qieqie 2007-02-07  
缓存是个大概念,要看具体缓存的数据是什么特性的。

对象Id映射缓存ORM处理的不错。

查询缓存ORM比较傻瓜,一次增删变更,会使全部同类的查询缓存就被抹杀了。所以查询缓存可用DAO里面做。

页面缓存不是特经常使用,因为如果是整个页面需要缓存的话,可以利用http协议的一些头参数,在发送请求时设置一下搞定。

一般系统,在ORM中配置对象ID映射缓存和DAO的缓存做好了,代价较小,同时效果也很不错。

1 楼 robbin 2007-02-07  
要看你的Cache是干吗用的了

如果是对象Cache,自然是ORM透明化出来;
如果是查询Cache,自然是DAO层处理;
如果是Action Cache,自然是Web 层Action处理;
如果是Page Cache,自然是Servlet Filter处理;

相关推荐

    代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)

    代码生成器是一种强大的工具,它能够自动生成常见的软件架构组件,如Entity、DAO、Service、Controller以及JSP页面,极大地提高了开发效率。在Java开发领域,这类工具通常用于快速构建基于MVC(Model-View-...

    Cache—主存两层存贮层模拟器

    Cache—主存两层存贮层模拟器,自己写的,老师检查过了还不错……

    Mybatis(dao)缓存|mybatis+redis(dao+service)缓存验证

    ### Mybatis(dao)缓存与mybatis+redis(dao+service)缓存验证 #### 一、Mybatis缓存机制概述 Mybatis提供了一级缓存和二级缓存两种缓存机制,这两种缓存机制有助于提高数据访问的效率。 **1.1 一级缓存** 一级...

    Java SSM service层配置文件

    6. **与其它配置文件的关联**:`applicationContext-service.xml`通常与`applicationContext-dao.xml`(用于配置DAO层)、`applicationContext-web.xml`(用于配置Web层)等共同工作,形成完整的SSM应用配置。...

    在模拟器上实现在任意地址流下求出在 Cache—主存两层存贮层次上的命中率

    ### 在模拟器上实现在任意地址流下求出在 Cache—主存两层存贮层次上的命中率 #### 实验目的与要求 本实验旨在帮助学生深入理解虚拟存储层次结构,掌握不同存储地址映射与变换的方法,以及熟悉常用替换算法(如...

    在模拟器上实现在任意块地址流下求出在 Cache—主存两层存贮层次上的命中率。

    本主题主要关注如何在模拟器上计算在Cache-主存两层存储层次上的命中率,这对于理解系统性能、优化设计以及教学实验具有重要意义。 命中率是指在访问存储系统时,所需数据能在Cache中找到的概率,是衡量Cache效率的...

    存贮层次模拟器1 Cache—主存两层存贮层

    1.Cache—主存:映像方式要实现全相联、直接映象、组相联方式三种方式,并选择每一种映像方式下输出结果;替换算法一般使用LRU算法。 2.要求主存容量、Cache大小、块大小以及组数等可以输入修改。 3.求出命中率;...

    系统结构实验 Cache--主存、虚拟存储器模拟) 存贮层次模拟器

    在IT领域,尤其是在计算机系统架构中,理解和模拟Cache与主存、虚拟存储器的工作机制是至关重要的。这个实验旨在帮助我们深入理解存储层次结构及其优化技术。以下将详细阐述相关知识点: 1. **Cache**: Cache是...

    cache实验 cache实验 cache实验

    cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验...

    SSH中通用dao类

    6. **性能优化**:为了提高性能,通用DAO还可以实现缓存机制,如使用Spring的`Cache`接口或集成第三方缓存框架如 Ehcache。此外,批处理操作(如批量插入、更新)也是提升效率的一种手段。 7. **测试支持**:通用...

    一键生成整库的mapper entity dao service serviceTest controller

    一键生成整库的mapper entity dao service serviceTest controller controllerTest controller注释-- 在线文档生成 前提是先建表写 表注释 字段注释 如果要使用doc文档 电脑需要配置node 安装apidoc 比swagger好用...

    PrimoCache重置工具

    2. SSD缓存:除了内存,PrimoCache还可以利用SSD固态硬盘作为缓存层,延长SSD寿命,同时利用其高速读写能力。 3. 热数据智能学习:软件能自动学习和识别哪些数据是经常访问的,优先进行缓存,提高效率。 4. 多级缓存...

    存贮层次模拟器cache

    1.Cache—主存:映像方式要实现全相联、直接映象、组相联方式三种方式,并选择每一种映像方式下输出结果;替换算法一般使用LRU算法。 3.要求主存容量、Cache大小、块大小以及组数等可以输入修改。 4.求出命中率;...

    springboot整合jetcache完整代码

    JetCache是阿里巴巴开源的一款高性能、轻量级的分布式缓存框架,适用于微服务架构中的缓存场景。本文将详细介绍如何在SpringBoot项目中整合JetCache,并探讨其本地缓存和Redis缓存的使用,以及如何实现多缓存的并行...

    TIC6678多核编程Cache总结.pdf

    为了利用位置原理,Cache采用直接映射Cache或组相联Cache的策略来映射低层内存地址到Cache中的位置,以减少缓存的访问延迟。 Cache基本知识: 在多核处理器中,Cache系统可能包含多种架构,如直接映射Cache和组相联...

    cache.rar_cache verilog_cache vhdl_verilog cache_verilog cac_vh

    缓存(Cache)是计算机系统中的重要组成部分,它在处理器与主存之间提供了一层高速的数据存储,以解决CPU速度与内存速度不匹配的问题。在硬件设计领域,特别是在数字电路和集成电路设计中,Verilog和VHDL是两种常用...

    cache性能分析实验

    3. **冲突失效(Conflict miss)**:在直接映射或组相联Cache中,过多的数据块映射到同一个Cache行,导致某块被其他块替换后再次访问时发生失效。 #### 降低Cache失效率的方法 - **增加Cache块大小**:增大块大小...

    分块矩阵优化cache

    ### 分块矩阵优化Cache:深度解析与应用策略 #### 核心知识点概览: 1. **Cache基础原理**:理解高速缓存(Cache)在现代计算机系统中的关键作用及其内部结构,包括标记存储器和数据存储器的功能。 2. **Cache失效...

Global site tag (gtag.js) - Google Analytics