业务逻辑与数据库之间缓存层
业务逻辑直接与数据库进行交互,这样将会严重影响系统的整体性能,因此在业务逻辑与数据库之间引入一层缓存层,当需要向数据库中添加数据实体时,先将数据实体对象放入到缓存,并将实体对象放入到队列中,以进行持久化;需要删除数据实体时,既要删除缓存中的实体对象,又要删除数据库中相应的实体对象;更新实体对象道理相同;查询实体对象时,可以通过三种方式进行查询,实体的主键、实体的唯一索引、实体的普通索引,前两者获取的是一个实体对象,后一个获取的是一个实体对象的集合,包含多个实体对象。
在实现的缓存中,有下面几个需要重点注意的点:
1.需要根据唯一性索引,以及普通索引进行实体对象的查询,因此我们引入了自定义注解,@Unique和@Index
2.为了简化代码逻辑,同时不会影响到具体业务逻辑使用的便利性,缓存层实现时默认将实体对象的名称定义为数据库表中相应的数据表名称。
3.缓存层具体使用的存储结构方面,引入了google团队开发的concurrentLinkedHashMap,用于存储实体对象。这种结构符合LRU(最近最久未使用算法),因此使用这种结构可以提高效率。
4.每一个实体我们相应的定义了一个ReentrantReadWriteLock对象,不要所有实体共用一个锁对象,这样效率问题将会是一个严重的问题。对所有个实体类所对应的数据表对象可以同时进行操作,这样使不会导致一些冲突问题。
5.生产者/消费者线程模型,对于增、删、改操作会不停的往实体队列集合中添加元素,类似于生产者;启动一些新的线程从实体队列集合中获取元素,并将这些元素持久化到数据库,类似于消费者。
6.对于删除实体操作,如果试图去查询一个正在被删除的实体对象,为了保证效率,不让试图查询实体的线程一直等待,而是直接返回相应的信息,可以使用一个集合记录正在被删除的实体的信息,供查询操作使用,从而减少一个不必要的时间开销。
第1点:
查询操作很多时候不仅仅是基于主键进行的,还有可能是基于其他字段进行的查询,引入@Unique和@Index可以使我们基于其他注解进行查询操作。
程序中,可以通过反射机制获取到被这些注解标记的字段的字段名称,对于具体对象,可以基于反射机制获取到该字段所对应的具体值。
第3点:
ConcurrentLinkedHashMap是google团队提供的一个容器,它可以用来实现一个基于URL的缓存,它本身是对ConcurrentHashMap的封装。ConcurrentLinkedHashMap的采用的是Builder(构造器)创建实例,它本身也实现了ConcurrentMap接口。ConcurrentLinkedHashMap中的每个元素会维护一个weight,每增加一个元素weight就累加,直到容量满。
ConcurrentLinkedHashMap VS ConcurrentHashMap:
ConcurrentLinkedHashMap需要维护一个操作队列,操作速度慢于ConcurrentHashMap,性能上不是差很多。由于ConcurrentLinkedHashMap是基于URL的缓存,可以保证比较高的命中率。
实现缓存的几种方式:
本文中选择的是第三种方式构建底层缓存结构。
业务逻辑与数据库之间缓存层相关推荐
- 三层架构:表示层-业务逻辑层-数据访问层
三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页 ...
- 三层架构:表示层-业务逻辑-数据层
三层架构:表示层-业务逻辑- 原文地址:三层架构:表示层-业务逻辑层-数据访问层 作者:灰烬 三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应 ...
- 三层架构:表示层-业务逻辑层-数据访问层2
概述 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构.微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层.业务逻辑层(又或称为领域层).表示层. 三层结构原理: 3个层次中, ...
- 三层架构:表示层-业务逻辑…
原文地址:三层架构:表示层-业务逻辑层-数据访问层作者:灰烬 三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样 ...
- 单件模式与业务逻辑服务层封装
目前,软件分层的思想已经得到普及,在我所做过的项目中也得到了很好的效果.但是也有明显的缺点,应付从下而上的变化时,往往需要级连修改,尤其是数据库结构发生变化,另外如果采用了NHibernate之类OR ...
- 系统业务逻辑书籍_新年福利 | 架构的“一小步”,业务的一大步
作者:闲鱼技术-绛曲 前言: 谈到"架构"这两个字,会有好多的名词闪现,比如:分层架构.事件驱动架构.DDD.CQRS等.亦或者一堆的软件设计原则,如:KISS原则(Keep it ...
- java业务逻辑_java业务逻辑怎么写?
现在Java项目一般都是用Spring全家桶开发,以web项目来讲结构主要分为Controller层.Service层和DAO层,细分的话有的项目可能还会有一个Manager层. 一个请求到达后端之后 ...
- SpringBoot框架实现简单业务逻辑
SpringBoot框架实现简单业务逻辑 总述 Entity层 Dao层 Mapper.xml Service层 ServiceImpl Controller层 完整的业务逻辑实现写法示例 Dao层声 ...
- Udi Dahan对于业务逻辑重用以及微服务方面的观点
今年的DDD Exchange大会在伦敦如期举行,Udi Dahan在大会上的一场演讲中从一种不同的角度对业务逻辑进行了剖析.他表示:近三十年来,重用已经成为了一种口号,它几乎可以套用在系统开发中的每 ...
最新文章
- Linux-什么是二进制包,源码包,RPM包,软件仓库
- 联想杜比音效_联想小新15 2020锐龙版开售
- 我是如何使用python控制迅雷自动下载电影的?
- SAP最强大的定价过程
- Android Studio使用Gradle上传AAR至Maven
- 【网】关于 Blog 和 RSS 的全面介绍
- 大数据常见组件的访问页面总结
- 每日一题(53)—— 评价代码片段
- linux中输入ls出现蓝色的点,linux上ls的蓝色太深,怎么处理
- 编写高质量代码改善C#程序的157个建议[4-9]
- 前端工具,网址推荐,方便开发,学习。
- 被称为最好最易理解的MATLAB入门教程
- 只你一招,解决NAS噪音及速度问题!
- Excel中的数字格式与文本格式进行转换
- 秉承极简美学设计:Polestar 2 登陆中国后会威胁到谁?
- HAL库之SYSTICK时钟频率探究-F407
- 一阶RC滤波器的算法实现(低通和高通)
- CSDN日报20170407 ——《嘿,程序猿,你该学点经济学了!》
- 【Industry digitization】能源供应商的数字化转型,能源世界正在发生不可逆转的深刻变革
- 反激式开关电源仿真 基于Matlab simulin仿真软件设计