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

数据库sequence序列高速缓存池——尽量减少排队和数据库的交互

 
阅读更多

获取数据库序列

林小应

1.问题描述

由于业务需要,应用程序中很多地方会用到数据库序列sequence,如果每次都去数据库获取,会比较耗时。
在Java代码中,我们通常调用存储过程或执行sql生成一个sequence,
select xxx.nextnvl from dual;
如果直接调用存储过程或执行sql取sequence,算上事务开销,一次需要3~4ms。在大型分布式系统中(如江苏电信的营业系统、淘宝网、大型社交网站),4ms将是一个很大的开销,试想如果需要的序列已经存储在于内存中,平均每次取sequence的时间损耗将低于0.01ms。

2.期望

避免每次前往数据库取序列,让获取sequence就像从内存中取一个对象一样简单、决不允许重复读取。

3.设计原理

获取sequence的Java代码类似如下:

     String seq = generateSeq(String seqType);

输入参数:seqType

输出参数:sequence

我的思路是:在内存中开辟一个大容器(HashMap),存放各种seqType的sequence队列(Queue)。由一个守护线程来完成队列的装填。
当第一次取某种类型的sequence,在容器中注册一下,记录下seqType。这样守护线程就能察觉到,守护线程不断检测所有类型的sequence队列。如果容量不足,就会启动装填机制,从数据获取一批新的sequence将空队列装满。

4. 实现

具体实现过程需要保证,多线程环境中资源锁的问题。这里我们用的HashMapConcurrentHashMap,是一种线程安全的高性能Map。Map中的seqType所对应的“sequence队列”,已经换成了队列组、即一个ArrayList中存放多个sequence队列。这样主要是为了降低并发带来的开销。

根据入参seqTypeA,首先取到的是一个ArrayList<ConcurrentLinkedQueue>,再根据ArrayList的size随机一个整数cur,再取ArrayList中第cur个sequence队列。并发压力和size的大小成反比!

示意图:

5. JVM序列池的生命周期

序列池的生命周期为:第一次注册 到 应用程序终止

6. 需要注意的问题

A. 不能读到脏数组,一个sequence不能被两次读到。上面我们的sequence都是从数据库来,保存在同步队列ConcurrentLinkedQueue中,这一点可以保证。

B. sequence的顺序,如果从数据库直接读取顺序是一致的。采用sequence池机制,可能后面读到的比前面读到的小/大。我们可以将上面的ArrayList的size设置成1就可以解决顺序问题(不使用于分布式环境)。

C.命中率问题,如果sequence池空了,主线程就会直接前往数据库。为了提高命中率,我们的系统中采用了备用池——主池空了以后,立即从备用池拉一个现成的队列替换当前队列(这个非常有效)。

D.灵活的配置,如队列池的深度(队列的长度)、宽度(ArrayList的size)、实时的开关机制等

7. 总结

以上只能简单说一下,我们对于这种频繁获取sequence情况的解决方案。我们的系统是40000000用户,分布式系统,多数据库。采用了sequence池机制以后,获取sequence的时间大大缩短了。

还有很多细节,大家动手做的时候再慢慢琢磨。

qq:346420558

分享到:
评论

相关推荐

    序列cache对性能的影响

    因此,在实际应用中,应根据系统的并发需求、内存资源和数据库性能监控结果来调整序列缓存的大小,以达到最佳的性能与资源利用平衡。 总之,序列缓存是数据库性能优化的重要方面,尤其在处理大量并发插入操作时。...

    使用JDeveloper开发WEB应用时同时使用Oracle的sequence和trigger

    在开发Web应用程序时,我们经常需要与数据库进行交互,存储和检索数据。Oracle数据库是一个广泛使用的数据库系统,它提供了丰富的特性和工具来帮助开发者高效管理数据。本篇将重点介绍如何在使用JDeveloper这款强大...

    MLDN魔乐科技JAVA培训_Oracle课堂22_序列、同义词.rar

    4. **序列安全性**:序列在多用户环境下可能存在并发问题,但Oracle通过锁定机制和缓存策略尽量减少这种风险。 【同义词(Synonyms)】在Oracle中,同义词是一种数据库对象,它提供了一个别名,使得用户可以使用...

    Sequence-Databases:用于创建和存储蛋白质 DNA 序列数据库的存储库

    - API接口:提供与数据库交互的编程接口,便于添加、检索和更新序列信息。 - 查询工具:支持基于序列、元数据等多种条件的查询,以满足不同分析需求。 - 序列格式转换:将不同格式的序列文件导入或导出到数据库,...

    java通过Mysql实现类似oracle序列功能序列.rar

    - 为避免过多的数据库交互,可以考虑缓存序列号在内存中,例如使用`ConcurrentHashMap`,在达到一定阈值或过期时再与数据库同步。 9. **错误处理**: - 在Java代码中,要处理可能出现的异常,如`SQLException`,...

    瀚高数据库hibernate方言 hgdb-hibernate-dialect

    5. 其他辅助类:如序列生成器(Sequence Generator),用于在瀚高数据库中生成主键。 在实际应用中,开发者需要在Hibernate配置文件中指定瀚高数据库的方言,这样Hibernate就能正确地处理与瀚高数据库的交互。通过...

    数据库对象培训资料(ppt-26页).ppt

    在Oracle中,创建序列可以通过`CREATE SEQUENCE`语句完成,例如创建名为`toys_seq`的序列,初始值为10,每次递增10,最大值为2000,最小值为10,不循环,并缓存10个值。序列的访问通常通过`NEXTVAL`和`CURRVAL`伪列...

    SEQUECE唯一健值的使用

    - `CACHE`:预取值的数量,预取的值存储在缓存中,这样可以减少与数据库的交互次数,提高性能。但是,如果在缓存中的值未被全部使用时发生系统崩溃,这些值可能会丢失。如果不想使用缓存,则使用`NOCACHE`。 #### ...

    hibernate连接oracle数据库.doc

    例如创建名为 student_sequence 的序列,设置初始值为 1000,每次递增 1,无最大值限制,且缓存 10 个值。 SQL 脚本: ```sql CREATE SEQUENCE student_sequence INCREMENT BY 1 START WITH 1000 NOMAXVALUE ...

    让CoolSQL支持Oracle Sequence的GeneratedKey,懂的入

    在Java编程中,我们经常需要处理与数据库的交互,包括生成自增序列(Sequence)作为主键。本篇文章将围绕"让CoolSQL支持Oracle Sequence的GeneratedKey"这一主题展开,探讨如何在开发过程中利用Oracle的Sequence特性...

    java一级缓存及对象关系映射

    一级缓存的主要作用是提高数据访问效率,避免频繁地与数据库进行交互。当对象被加载到Session中时,它们会被自动放入一级缓存。在同一个Session内,对于同一个OID(对象标识符)的对象,无论何时何地,只要不关闭...

    基于Mysql的Sequence实现方法

    这样可以减少数据库的交互次数,提高性能。 以下是一个基于Java实现的示例,使用了乐观锁和本地缓存策略: 首先,创建一个存储序列信息的表`t_pub_sequence`,包含序列名称、当前值、最小值、最大值、每次取值的...

    iOS-多媒体-强大的动画-序列帧和无限循环动画-9Cheetah-serial-repeating

    序列帧动画和无限循环动画是两种常见的增强视觉效果的技术,尤其在游戏、动态图标以及各种交互设计中广泛应用。本资源"iOS-多媒体-强大的动画-序列帧和无限循环动画-9Cheetah-serial-repeating"深入探讨了这些概念,...

    hibernate性能优化.doc

    - **Oracle的Fetch Size**:设置合适的Fetch Size(例如30、50或100),可以减少数据库与JVM之间的交互次数,提高性能。在Hibernate配置中指定`hibernate.jdbc.fetch_size`。 2. **代码重构**: - 减少对数据库的...

    Oracle数据库应用-复习题及答案.pdf

    - SGA (System Global Area) 是Oracle数据库的一个共享内存区域,用于缓存数据和控制信息。其中包括日志缓冲区、数据缓冲区、共享池等。 - PGA 是程序全局区,为每一个服务器进程所独有,不属于SGA。 **2. 组成...

    Hibernate框架讲义.pdf

    - Hibernate定义了多种数据类型和主键生成策略,如assigned(手动指定)、increment(自动递增)、identity(数据库自增长)、sequence(数据库序列)、native(根据数据库类型自动选择)、uuid(128位UUID)、...

    Oracle复习题.docx

    根据提供的文档信息,我们可以归纳总结出一系列与Oracle数据库相关的知识点,包括但不限于动态数据字典视图、系统全局区(SGA)、进程交互、表空间管理、序列管理、子查询使用、索引优化等方面。 ### 一、Oracle...

    JAVA学习资料-Hibernate简介.doc

    - **Sequence**:适用于支持序列的数据库,如Oracle和DB2,需要在映射文件中配置。 - **Identity**:依赖于数据库的自动增长功能,如MySQL的`auto_increment`或SQL Server的`Identity`。 **缓存管理** Hibernate...

    hibernet面试笔试题

    - Increment:依赖于数据库的序列功能,如 Oracle 的 Sequence,适合单一进程访问数据库,不适合集群环境。 - Identity:基于数据库的自动增长特性,例如 MySQL 的 AUTO_INCREMENT 或 SQL Server 的 IDENTITY。...

    oracle学习笔记

    - **DB Buffer Cache**:存储数据块的缓存区域,分为默认缓存池、保持缓存池和再生缓存池。 - **Shared Pool**:包含库缓存区和字典缓存区,其中库缓存区用于存储最近执行的SQL语句和PL/SQL代码,字典缓存区存储...

Global site tag (gtag.js) - Google Analytics