CN110109958A - 缓存处理方法、装置、设备及计算机可读存储介质 - Google Patents
缓存处理方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN110109958A CN110109958A CN201910321455.6A CN201910321455A CN110109958A CN 110109958 A CN110109958 A CN 110109958A CN 201910321455 A CN201910321455 A CN 201910321455A CN 110109958 A CN110109958 A CN 110109958A
- Authority
- CN
- China
- Prior art keywords
- caching
- thread
- data
- hash table
- level
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/252—Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
Abstract
本发明公开了一种缓存处理方法,该方法包括:当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。本发明还公开了一种缓存处理装置、设备和一种计算机可读存储介质。本发明提高了JVM本地线程级缓存方案的灵活性。
Description
技术领域
本发明涉及金融科技(Fintech)技术领域,尤其涉及缓存处理方法、装置、设备及计算机可读存储介质。
背景技术
近年来,随着互联网技术,尤其是互联网金融科技(Fintech)的飞速发展,越来越多的技术(大数据、分布式、区块链Blockchain、人工智能等)应用在金融领域,金融数据也呈几何级增长,以大型商业银行为例,通常它们拥有成百上千个业务系统以及上亿用户的海量数据,这种情况下,对数据存储的数据量,并发性和响应速度都提出了更高要求。目前在金融领域,在使用JVM(Java Virtual Machine,Java虚拟机)访问金融数据库表时会用到缓存技术,即,将要操作的数据库表记录加载到本地JVM内存,以提高程序访问数据的速度,并降低数据库压力。
在现有的基于Java程序语言的数据持久化框架(如Mybatis、Hibernate)中,线程级缓存无法做到细粒度控制,即一旦缓存启用之后,会对所有库表的查询结果做缓存,这会导致占用过多的内存空间,影响系统性能。因而,现有的JVM本地线程级缓存方案的灵活性还有待提高。
发明内容
本发明的主要目的在于提出一种缓存处理方法、装置、设备及计算机可读存储介质,旨在提高JVM本地线程级缓存方案的灵活性。
为实现上述目的,本发明提供一种缓存处理方法,所述缓存处理方法包括如下步骤:
当检测到应用程序调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;
根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;
若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;
若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。
优选地,所述当检测到应用程序调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数的步骤之前,还包括:
在应用程序启动时,读取预设的缓存配置表,所述缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息;
根据所述缓存配置信息生成一个缓存定义哈希表,将所述缓存定义哈希表保存至预设的java虚拟机级缓存定义区中。
优选地,所述缓存处理方法还包括:
接收基于所述缓存配置表的修改指令,根据所述修改指令修改所述缓存配置表中的缓存配置信息;
根据修改后的所述缓存配置信息生成一个新的缓存定义哈希表;
将所述java虚拟机级缓存定义区中保存的所述缓存定义哈希表更新为所述新的缓存定义哈希表。
优选地,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识未加记录锁的数据查询操作时,根据所述传入参数查询预设的第一线程级缓存数据哈希表,得到第一查询结果;
判断所述第一查询结果是否为空;
若所述第一查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表中。
优选地,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识加记录锁的数据查询操作时,根据所述传入参数查询预设的第二线程级缓存数据哈希表,得到第二查询结果;
判断所述第二查询结果是否为空;
若所述第二查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中。
优选地,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中;
判断所述第二线程级缓存数据哈希表中是否存在与所述传入参数对应的更新对象,若存在,则根据所述传入参数对所述更新对象进行更新。
优选地,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中。
优选地,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;
根据所述传入参数在所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中删除对应的数据。
此外,为实现上述目的,本发明还提供一种缓存处理装置,所述缓存处理装置包括:
获取模块,用于当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;
第一判断模块,用于根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;
第二判断模块,用于若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;
执行模块,用于若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。
优选地,所述缓存处理装置还包括:
读取模块,用于在应用程序启动时,读取预设的缓存配置表,所述缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息;
生成模块,用于根据所述缓存配置信息生成一个缓存定义哈希表,将所述缓存定义哈希表保存至预设的java虚拟机级缓存定义区中。
优选地,所述缓存处理装置还包括:
修改模块,用于接收基于所述缓存配置表的修改指令,根据所述修改指令修改所述缓存配置表中的缓存配置信息;
所述生成模块,还用于根据修改后的所述缓存配置信息生成一个新的缓存定义哈希表;
更新模块,用于将所述java虚拟机级缓存定义区中保存的所述缓存定义哈希表更新为所述新的缓存定义哈希表。
优选地,所述执行模块还用于:
当所述方法名标识未加记录锁的数据查询操作时,根据所述传入参数查询预设的第一线程级缓存数据哈希表,得到第一查询结果;
判断所述第一查询结果是否为空;
若所述第一查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表中。
优选地,所述执行模块还用于:
当所述方法名标识加记录锁的数据查询操作时,根据所述传入参数查询预设的第二线程级缓存数据哈希表,得到第二查询结果;
判断所述第二查询结果是否为空;
若所述第二查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中。
优选地,所述执行模块还用于:
当所述方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中;
判断所述第二线程级缓存数据哈希表中是否存在与所述传入参数对应的更新对象,若存在,则根据所述传入参数对所述更新对象进行更新。
优选地,所述执行模块还用于:
当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中。
优选地,所述执行模块还用于:
当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;
根据所述传入参数在所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中删除对应的数据。
此外,为实现上述目的,本发明还提供一种缓存处理设备,所述缓存处理设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的缓存处理程序,所述缓存处理程序被所述处理器执行时实现如上所述的缓存处理方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有缓存处理程序,所述缓存处理程序被处理器执行时实现如上所述的缓存处理方法的步骤。
本发明在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;若存在,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。这种方式相比于现有技术中对所有库表的查询结果做缓存的方式,实现了线程级缓存的细粒度控制,即,只有当预设的缓存定义哈希表中存在与当前调用的数据库访问接口的类名对应的库表缓存定义,且当前已启用与所述库表缓存定义对应的线程级缓存功能时,才会执行对应的线程级缓存数据读写操作,从而本发明提高了JVM本地线程级缓存方案的灵活性。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明缓存处理方法第一实施例的流程示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
本发明实施例缓存处理设备可以是PC机或服务器设备,其上运行有Java虚拟机。
如图1所示,该缓存处理设备可以包括:处理器1001,例如CPU,网络接口1004,用户接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的设备结构并不构成对设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及缓存处理程序。
在图1所示的设备中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端(用户端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的缓存处理程序,并执行下述缓存处理方法中的操作。
基于上述硬件结构,提出本发明缓存处理方法实施例。
参照图2,图2为本发明缓存处理方法第一实施例的流程示意图,所述方法包括:
步骤S10,当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;
本实施例缓存处理方法应用于缓存处理设备,该缓存处理设备上运行有JVM(JavaVirtual Machine,Java虚拟机),JVM采用Mybatis或Hibernate等基于Java程序语言的数据持久化框架实现对数据库进行操作。比如在金融领域中,经常需要使用JVM访问金融数据库表,如账务信息表,开户信息表,金融交易信息表等,这一过程中会用到缓存技术以满足金融业务的并发性和访问速度要求。
在本实施例中,以采用Mybatis对数据库进行操作为例进行说明。Mybatis访问数据库的接口称为Mapper,当JVM在应用程序的预设线程中检测到调用数据库访问接口Mapper的指令时,获取当前调用的Mapper类名、Mapper方法名和传入参数,其中,传入参数用于表示要进行读写的域(Domain)对象,一个域对象对应于一条数据库表记录。
具体地,可以预先在所有Mapper上定义拦截器,比如:
@Around("execution(public*com.xxx..mapper..*.*(..))&&bean(*Mapper)"),表示对所有Mapper中的所有方法都执行拦截。系统运行时,每次对Mapper的调用,都会被拦截器拦截,拦截器获取到当次调用的Mapper类名、Mapper方法名和传入参数。
需要说明的是,在本实施例中,可以采用Mybatis代码生成器生成访问数据库的代码,以提高开发效率,并使得所有Mapper和其方法的命名规则统一,从而保证拦截器能够拦截访问数据库的代码;此外也可以不采用Mybatis代码生成器,只要Mybatis Mapper命名和其方法命名规则统一,拦截器也可对其进行拦截。
步骤S20,根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;
该步骤中,根据上述获取到的Mapper类名查询预设的缓存定义哈希表,判断该缓存定义哈希表中是否存在与Mapper类名对应的库表缓存定义。
具体地,可以预先在系统中设置一个JVM级的缓存定义区,该缓存定义区用于保存缓存定义哈希表,该缓存定义哈希表表现为一个HashMap,该HashMap实现了“Key-Value键值对”接口,结构如下:
Key | Value |
mapperName1 | sysTransCacheDef1 |
mapperName2 | sysTransCacheDef2 |
…… | …… |
其中,Key为SysTransCacheDef域对象的mapperName(Mapper类名),value为SysTransCacheDef域对象本身。
如果缓存定义哈希表中存在当前调用的Mapper类名,则可以判定该缓存定义哈希表中存在与该Mapper类名对应的库表缓存定义,反之,则判定该缓存定义哈希表中不存在与该Mapper类名对应的库表缓存定义。
若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则执行步骤S30,判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;
该步骤中,若缓存定义哈希表中存在与当前调用的Mapper类名对应的库表缓存定义,则进一步判断当前是否启用与该库表缓存定义对应的线程级缓存功能。
具体实施时,可以在SysTransCacheDef域对象中用一个缓存功能使能位enabled来控制是否启用与该SysTransCacheDef域对象对应的线程级缓存功能,通过获取enabled值,即可判断当前是否启用与该库表缓存定义对应的线程级缓存功能,比如,若检测到enabled=1,则判定当前已启用与库表缓存定义对应的线程级缓存功能,若检测到enabled=0,则判定当前未启用与库表缓存定义对应的线程级缓存功能。
若当前已启用与所述库表缓存定义对应的线程级缓存功能,则执行步骤S40,根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。
该步骤中,若当前已启用与库表缓存定义对应的线程级缓存功能,则根据Mapper方法名和传入参数执行对应的线程级缓存数据读写操作,其中,Mapper方法名用于标识所执行的线程级缓存数据读写操作的类型,其包括数据查询、数据插入、数据更新、数据删除等操作。比如,当Mapper方法名标识数据查询操作时,先根据传入参数从当前线程的缓存数据区中查询数据,若缓存数据区中存在对应的数据,则返回查询结果,若缓存数据区中不存在对应的数据,则再从数据库中查询,并返回查询结果,并将查询结果保存在缓存数据区中;当Mapper方法名标识数据插入操作时,先在数据库中插入对应的数据,然后根据传入参数将插入的数据保存在当前线程的缓存数据区中;当Mapper方法名标识数据更新操作时,先对数据库中的对应的数据进行更新,然后根据传入参数将更新后的数据保存在当前线程的缓存数据区中。由此,实现了对缓存数据进行不同类型的读写操作。
需要说明的是,本实施例中所提及的缓存数据区的缓存均为线程级的缓存,缓存数据区中的缓存数据仅对当前线程可用,线程结束后缓存自动销毁,该线程级的缓存尤其适用于在同一个线程中需要对相同记录做多次操作的库表。
本实施例当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;若存在,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。这种方式相比于现有技术中对所有库表的查询结果做缓存的方式,实现了线程级缓存的细粒度控制,即,只有当预设的缓存定义哈希表中存在与当前调用的数据库访问接口的类名对应的库表缓存定义,且当前已启用与所述库表缓存定义对应的线程级缓存功能时,才会执行对应的线程级缓存数据读写操作,从而本实施例提高了JVM本地线程级缓存方案的灵活性。
进一步地,基于本发明缓存处理方法第一实施例,提出本发明缓存处理方法第二实施例。
在本实施例中,上述步骤S10之前,还可以包括:在应用程序启动时,读取预设的缓存配置表,所述缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息;根据所述缓存配置信息生成一个缓存定义哈希表,将所述缓存定义哈希表保存至预设的java虚拟机级缓存定义区中。
在本实施例中,在应用程序启动时需加载缓存定义到JVM内存中。具体实施时,首先读取预设的缓存配置表,该缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息,该缓存配置信息可以包括Mybatis访问数据库的接口的类名、Mybatis访问数据库的Domain域名、Domain中的主键属性字段、缓存功能使能位以及描述信息。具体地,缓存配置表sys_trans_cache_def的结构如下表所示:
比如,有一个银行客户账信息主表,表名为ca_acct_mast,其主键为entity_code+acct_no,需要将其配置为线程级缓存,则做配置如下:
mapper_name:CaAcctMastMapper
domain_name:CaAcctMast
primary_Key:entityCode,acctNo
enabled:1
description:客户账信息主表
在读取到缓存配置表后,获取该缓存配置表中的所有记录,得到一个由SysTransCacheDef域对象组成的链表,将该链表重新组装为一个缓存定义哈希表HashMap;在该缓存定义哈希表中,Key为SysTransCacheDef域对象的mapperName(Mapper类名),value为SysTransCacheDef域对象本身;之后,将该HashMap保存至预设的JVM级的缓存定义区中,以供后续查询。
上述方式通过将在应用程序启动时加载缓存定义到JVM内存中,为后续根据当前调用的数据库访问接口的类名查询预设的缓存定义哈希表提供了前提保证。
进一步地,所述缓存处理方法还可以包括:接收基于所述缓存配置表的修改指令,根据所述修改指令修改所述缓存配置表中的缓存配置信息;根据修改后的所述缓存配置信息生成一个新的缓存定义哈希表;将所述java虚拟机级缓存定义区中保存的所述缓存定义哈希表更新为所述新的缓存定义哈希表。
在本实施例中,用户可以触发修改指令以修改上述缓存配置表。当系统接收到基于缓存配置表的修改指令时,即根据该修改指令修改缓存配置表中的缓存配置信息,其中修改包括增加、删除和改动。比如,当用户想要新增缓存定义时,只需在缓存配置表中插入一条记录;当用户想要禁用某一条缓存时,只需将缓存配置表中对应的记录删除,或将enabled位改为0。之后,系统根据修改后的缓存配置信息生成一个新的缓存定义哈希表,并将java虚拟机级缓存定义区中保存的缓存定义哈希表更新为新的缓存定义哈希表。
需要说明的是,在一实施方式中,用户在修改缓存配置表中的缓存配置信息后,可以手动触发更新指令以更新缓存定义哈希表;在另一实施方式中,也可以通过创建一个轮询线程,通过该轮询线程定时触发(比如每隔30秒)读取缓存配置表中的全部数据,并根据读取到的数据对缓存定义哈希表进行更新。
本实施例通过提供对缓存配置表的修改功能,不需要修改代码或配置文件,不需要重新部署,也不需要重启系统,只需要对缓存配置表做增、删、改,即可达到启用缓存、禁用缓存的目的,灵活程度非常高。
进一步地,基于本发明缓存处理方法第一实施例,提出本发明缓存处理方法第三实施例。
在本实施例中,上述步骤S40可以包括:当所述方法名标识未加记录锁的数据查询操作时,根据所述传入参数查询预设的第一线程级缓存数据哈希表,得到第一查询结果;判断所述第一查询结果是否为空;若所述第一查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表中。
当Mapper方法名标识未加记录锁的数据查询操作时,先根据传入参数获得访问数据库的域名domain_name,再根据domain_name和传入参数从预设的第一线程级缓存数据哈希表中查询,得到第一查询结果。该第一线程级缓存数据哈希表保存在预设的第一线程级缓存数据区中,其结构如下表所示:
Key | Value |
domainName1+primaryKey1 | domain1 |
domainName1+primaryKey2 | domain2 |
domainName2+primaryKey3 | domain3 |
…… | …… |
其中,Key为域名+主键名,value为域对象,一个域对象对应数据库表中的一条记录。
若该第一查询结果不为空,说明第一线程级缓存数据区中存在对应的数据,此时返回查询结果即可;若该第一查询结果为空,说明第一线程级缓存数据区中不存在对应的数据,此时执行调用数据库访问接口的操作,以从数据库中查询对应的数据,并将对应的调用结果保存至第一线程级缓存数据哈希表中,以供下次查询相同的数据时直接从缓存中读取。
进一步地,上述步骤S40还可以包括:当所述方法名标识加记录锁的数据查询操作时,根据所述传入参数查询预设的第二线程级缓存数据哈希表,得到第二查询结果;判断所述第二查询结果是否为空;若所述第二查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中。
在本实施例中,记录锁即当一个进程正在读或修改文件的某个部分时,它可以阻止其他进程修改同一文件区。当Mapper方法名标识加记录锁的数据查询操作(一般在更新数据时用到)时,先根据传入参数获得访问数据库的域名domain_name,再根据domain_name和传入参数从预设的第二线程级缓存数据哈希表中查询,得到第二查询结果。其中,第二线程级缓存数据哈希表保存在预设的第二线程级缓存数据区中,其结构与上述第一线程级缓存数据哈希表类似,此处不作赘述。
若该第二查询结果不为空,说明第二线程级缓存数据区中存在对应的数据,此时返回查询结果即可;若该第二查询结果为空,说明第二线程级缓存数据区中不存在对应的数据,此时执行调用数据库访问接口的操作,以从数据库中加锁查询对应的数据,并将对应的调用结果保存至第一线程级缓存数据哈希表和第二线程级缓存数据哈希表中,以供下次查询相同的数据时直接从缓存中读取。
需要说明的是,设置第一线程级缓存数据哈希表和第二线程级缓存数据哈希表的目的在于区分不加记录锁的数据查询操作和加记录锁的数据查询操作,通过这种设置,如果先执行不加记录锁的数据查询操作,再对相同的记录执行加记录锁的数据查询操作,仍然需要操作数据库,如果先执行加记录锁的数据查询操作,再对相同的记录执行不加记录锁的数据查询操作,则不需要再查询数据库,从而提高了数据查询效率。
进一步地,上述步骤S40还可以包括:当所述方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中;判断所述第二线程级缓存数据哈希表中是否存在与所述传入参数对应的更新对象,若存在,则根据所述传入参数对所述更新对象进行更新。
当Mapper方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将传入参数保存至第一线程级缓存数据哈希表中,然后判断第二线程级缓存数据哈希表中是否存在与该传入参数对应的更新对象,若存在,则根据该传入参数对该更新对象进行更新,以保证第二线程级缓存数据哈希表中保存的是最新的数据;若不存在,则不作任何处理。
进一步地,上述步骤S40还可以包括:当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中。
当Mapper方法名标识当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中,以使第一线程级缓存数据哈希表中的数据和数据库保持一致性。
进一步地,上述步骤S40还可以包括:当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;根据所述传入参数在所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中删除对应的数据。
当Mapper方法名标识当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;然后,根据传入参数在第一线程级缓存数据哈希表和第二线程级缓存数据哈希表中删除对应的数据,以使第一线程级缓存数据哈希表和第二线程级缓存数据哈希表中的数据和数据库保持一致性。
通过上述方式,实现了对数据查询、插入和更新操作进行缓存处理,相比于现有技术仅能对数据查询操作做缓存处理,提高了JVM缓存功能的全面性,从而有利于提高相应的数据读写效率;此外,上述线程级读写缓存的机制与业务逻辑完全解耦,业务层开发人员无需感知缓存的存在,只需要调用数据库访问接口读写数据库即可,相比于现有的在业务逻辑处理的工程中执行缓存读写的机制,降低了编码复杂度,提高了编码效率,且具有较高的灵活性。
本发明还提供一种缓存处理装置。所述缓存处理装置包括:
获取模块,用于当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;
第一判断模块,用于根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;
第二判断模块,用于若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;
执行模块,用于若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。
进一步地,所述缓存处理装置还包括:
读取模块,用于在应用程序启动时,读取预设的缓存配置表,所述缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息;
生成模块,用于根据所述缓存配置信息生成一个缓存定义哈希表,将所述缓存定义哈希表保存至预设的java虚拟机级缓存定义区中。
进一步地,所述缓存处理装置还包括:
修改模块,用于接收基于所述缓存配置表的修改指令,根据所述修改指令修改所述缓存配置表中的缓存配置信息;
所述生成模块,还用于根据修改后的所述缓存配置信息生成一个新的缓存定义哈希表;
更新模块,用于将所述java虚拟机级缓存定义区中保存的所述缓存定义哈希表更新为所述新的缓存定义哈希表。
进一步地,所述执行模块还用于:
当所述方法名标识未加记录锁的数据查询操作时,根据所述传入参数查询预设的第一线程级缓存数据哈希表,得到第一查询结果;
判断所述第一查询结果是否为空;
若所述第一查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表中。
进一步地,所述执行模块还用于:
当所述方法名标识加记录锁的数据查询操作时,根据所述传入参数查询预设的第二线程级缓存数据哈希表,得到第二查询结果;
判断所述第二查询结果是否为空;
若所述第二查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中。
进一步地,所述执行模块还用于:
当所述方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中;
判断所述第二线程级缓存数据哈希表中是否存在与所述传入参数对应的更新对象,若存在,则根据所述传入参数对所述更新对象进行更新。
进一步地,所述执行模块还用于:
当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中。
进一步地,所述执行模块还用于:
当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;
根据所述传入参数在所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中删除对应的数据。
上述各程序模块所执行的方法可参照本发明缓存处理方法各个实施例,此处不再赘述。
本发明还提供一种计算机可读存储介质。
本发明计算机可读存储介质上存储有缓存处理程序,所述缓存处理程序被处理器执行时实现如上所述的缓存处理方法的步骤。
其中,在所述处理器上运行的缓存处理程序被执行时所实现的方法可参照本发明缓存处理方法各个实施例,此处不再赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (18)
1.一种缓存处理方法,其特征在于,所述缓存处理方法包括如下步骤:
当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;
根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;
若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;
若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。
2.如权利要求1所述的缓存处理方法,其特征在于,所述当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数的步骤之前,还包括:
在应用程序启动时,读取预设的缓存配置表,所述缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息;
根据所述缓存配置信息生成一个缓存定义哈希表,将所述缓存定义哈希表保存至预设的java虚拟机级缓存定义区中。
3.如权利要求2所述的缓存处理方法,其特征在于,所述缓存处理方法还包括:
接收基于所述缓存配置表的修改指令,根据所述修改指令修改所述缓存配置表中的缓存配置信息;
根据修改后的所述缓存配置信息生成一个新的缓存定义哈希表;
将所述java虚拟机级缓存定义区中保存的所述缓存定义哈希表更新为所述新的缓存定义哈希表。
4.如权利要求1所述的缓存处理方法,其特征在于,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识未加记录锁的数据查询操作时,根据所述传入参数查询预设的第一线程级缓存数据哈希表,得到第一查询结果;
判断所述第一查询结果是否为空;
若所述第一查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表中。
5.如权利要求4所述的缓存处理方法,其特征在于,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识加记录锁的数据查询操作时,根据所述传入参数查询预设的第二线程级缓存数据哈希表,得到第二查询结果;
判断所述第二查询结果是否为空;
若所述第二查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中。
6.如权利要求5所述的缓存处理方法,其特征在于,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中;
判断所述第二线程级缓存数据哈希表中是否存在与所述传入参数对应的更新对象,若存在,则根据所述传入参数对所述更新对象进行更新。
7.如权利要求6所述的缓存处理方法,其特征在于,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中。
8.如权利要求7所述的缓存处理方法,其特征在于,所述根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作的步骤包括:
当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;
根据所述传入参数在所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中删除对应的数据。
9.一种缓存处理装置,其特征在于,所述缓存处理装置包括:
获取模块,用于当在应用程序的预设线程中检测到调用数据库访问接口的指令时,获取当前调用的数据库访问接口的类名、方法名和传入参数;
第一判断模块,用于根据所述类名查询预设的缓存定义哈希表,判断所述缓存定义哈希表中是否存在与所述类名对应的库表缓存定义;
第二判断模块,用于若所述缓存定义哈希表中存在与所述类名对应的库表缓存定义,则判断当前是否已启用与所述库表缓存定义对应的线程级缓存功能;
执行模块,用于若当前已启用与所述库表缓存定义对应的线程级缓存功能,则根据所述方法名和所述传入参数执行对应的线程级缓存数据读写操作。
10.如权利要求9所述的缓存处理装置,其特征在于,所述缓存处理装置还包括:
读取模块,用于在应用程序启动时,读取预设的缓存配置表,所述缓存配置表中记录有基于不同的数据库访问接口的类名设置的缓存配置信息;
生成模块,用于根据所述缓存配置信息生成一个缓存定义哈希表,将所述缓存定义哈希表保存至预设的java虚拟机级缓存定义区中。
11.如权利要求10所述的缓存处理装置,其特征在于,所述缓存处理装置还包括:
修改模块,用于接收基于所述缓存配置表的修改指令,根据所述修改指令修改所述缓存配置表中的缓存配置信息;
所述生成模块,还用于根据修改后的所述缓存配置信息生成一个新的缓存定义哈希表;
更新模块,用于将所述java虚拟机级缓存定义区中保存的所述缓存定义哈希表更新为所述新的缓存定义哈希表。
12.如权利要求9所述的缓存处理装置,其特征在于,所述执行模块还用于:
当所述方法名标识未加记录锁的数据查询操作时,根据所述传入参数查询预设的第一线程级缓存数据哈希表,得到第一查询结果;
判断所述第一查询结果是否为空;
若所述第一查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表中。
13.如权利要求12所述的缓存处理装置,其特征在于,所述执行模块还用于:
当所述方法名标识加记录锁的数据查询操作时,根据所述传入参数查询预设的第二线程级缓存数据哈希表,得到第二查询结果;
判断所述第二查询结果是否为空;
若所述第二查询结果为空,则执行调用数据库访问接口的操作,并将对应的调用结果保存至所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中。
14.如权利要求13所述的缓存处理装置,其特征在于,所述执行模块还用于:
当所述方法名标识数据更新操作时,执行调用数据库访问接口的操作,以在数据库中更新对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中;
判断所述第二线程级缓存数据哈希表中是否存在与所述传入参数对应的更新对象,若存在,则根据所述传入参数对所述更新对象进行更新。
15.如权利要求14所述的缓存处理装置,其特征在于,所述执行模块还用于:
当所述方法名标识数据插入操作时,执行调用数据库访问接口的操作,以在数据库中插入对应的数据,并将所述传入参数保存至所述第一线程级缓存数据哈希表中。
16.如权利要求15所述的缓存处理装置,其特征在于,所述执行模块还用于:
当所述方法名标识数据删除操作时,执行调用数据库访问接口的操作,以在数据库中删除对应的数据;
根据所述传入参数在所述第一线程级缓存数据哈希表和所述第二线程级缓存数据哈希表中删除对应的数据。
17.一种缓存处理设备,其特征在于,所述缓存处理设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的缓存处理程序,所述缓存处理程序被所述处理器执行时实现如权利要求1至8中任一项所述的缓存处理方法的步骤。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有缓存处理程序,所述缓存处理程序被处理器执行时实现如权利要求1至8中任一项所述的缓存处理方法的步骤。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910321455.6A CN110109958A (zh) | 2019-04-19 | 2019-04-19 | 缓存处理方法、装置、设备及计算机可读存储介质 |
PCT/CN2020/077614 WO2020211554A1 (zh) | 2019-04-19 | 2020-03-03 | 缓存处理方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910321455.6A CN110109958A (zh) | 2019-04-19 | 2019-04-19 | 缓存处理方法、装置、设备及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110109958A true CN110109958A (zh) | 2019-08-09 |
Family
ID=67485964
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910321455.6A Pending CN110109958A (zh) | 2019-04-19 | 2019-04-19 | 缓存处理方法、装置、设备及计算机可读存储介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN110109958A (zh) |
WO (1) | WO2020211554A1 (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110968603A (zh) * | 2019-11-29 | 2020-04-07 | 中国银行股份有限公司 | 一种数据访问方法及装置 |
CN110990439A (zh) * | 2019-12-13 | 2020-04-10 | 深圳前海环融联易信息科技服务有限公司 | 基于缓存的快速查询方法、装置、计算机设备及存储介质 |
CN111506499A (zh) * | 2020-04-08 | 2020-08-07 | 百度在线网络技术(北京)有限公司 | 一种小程序中参数可用性检测方法、装置以及电子设备 |
WO2020211570A1 (zh) * | 2019-04-19 | 2020-10-22 | 深圳前海微众银行股份有限公司 | 缓存处理方法、装置、设备及计算机可读存储介质 |
WO2020211554A1 (zh) * | 2019-04-19 | 2020-10-22 | 深圳前海微众银行股份有限公司 | 缓存处理方法、装置、设备及计算机可读存储介质 |
CN112199391A (zh) * | 2020-09-30 | 2021-01-08 | 深圳前海微众银行股份有限公司 | 一种数据加锁检测方法、设备及计算机可读存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100530186C (zh) * | 2006-12-26 | 2009-08-19 | 腾讯科技(深圳)有限公司 | 缓存处理方法以及缓存处理系统 |
CN104750720B (zh) * | 2013-12-30 | 2018-04-27 | 中国银联股份有限公司 | 多线程并发访问环境下高性能数据处理的实现 |
US20160364315A1 (en) * | 2015-06-12 | 2016-12-15 | Arizona Board Of Regents On Behalf Of Arizona State University | Fast data race detection for multicore systems |
CN105426238B (zh) * | 2016-01-17 | 2017-08-25 | 浙江维融电子科技股份有限公司 | 一种基于内存的设备后台指令管理系统的控制方法 |
CN110109958A (zh) * | 2019-04-19 | 2019-08-09 | 深圳前海微众银行股份有限公司 | 缓存处理方法、装置、设备及计算机可读存储介质 |
-
2019
- 2019-04-19 CN CN201910321455.6A patent/CN110109958A/zh active Pending
-
2020
- 2020-03-03 WO PCT/CN2020/077614 patent/WO2020211554A1/zh active Application Filing
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020211570A1 (zh) * | 2019-04-19 | 2020-10-22 | 深圳前海微众银行股份有限公司 | 缓存处理方法、装置、设备及计算机可读存储介质 |
WO2020211554A1 (zh) * | 2019-04-19 | 2020-10-22 | 深圳前海微众银行股份有限公司 | 缓存处理方法、装置、设备及计算机可读存储介质 |
CN110968603A (zh) * | 2019-11-29 | 2020-04-07 | 中国银行股份有限公司 | 一种数据访问方法及装置 |
CN110990439A (zh) * | 2019-12-13 | 2020-04-10 | 深圳前海环融联易信息科技服务有限公司 | 基于缓存的快速查询方法、装置、计算机设备及存储介质 |
CN111506499A (zh) * | 2020-04-08 | 2020-08-07 | 百度在线网络技术(北京)有限公司 | 一种小程序中参数可用性检测方法、装置以及电子设备 |
CN111506499B (zh) * | 2020-04-08 | 2023-06-02 | 百度在线网络技术(北京)有限公司 | 一种小程序中参数可用性检测方法、装置以及电子设备 |
CN112199391A (zh) * | 2020-09-30 | 2021-01-08 | 深圳前海微众银行股份有限公司 | 一种数据加锁检测方法、设备及计算机可读存储介质 |
CN112199391B (zh) * | 2020-09-30 | 2024-02-23 | 深圳前海微众银行股份有限公司 | 一种数据加锁检测方法、设备及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2020211554A1 (zh) | 2020-10-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110109958A (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
CN110096334A (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
US9547601B2 (en) | Custom caching | |
CN106021445B (zh) | 一种加载缓存数据的方法及装置 | |
CN107563887B (zh) | 基于as400银行核心账务系统零停机日切方法 | |
US7636736B1 (en) | Method and apparatus for creating and using a policy-based access/change log | |
CN110221901A (zh) | 容器资源创建方法、装置、设备及计算机可读存储介质 | |
US8429633B2 (en) | Managing memory to support large-scale interprocedural static analysis for security problems | |
CN111610979B (zh) | 一种经过持久化和耦合度优化的api网关及其方法 | |
CN105760232B (zh) | 用于ios应用的离线缓存方法及系统 | |
CN107463378A (zh) | 一种基于注解的本地缓存实现方法、存储设备及电子设备 | |
CN110175163A (zh) | 基于业务功能智能解析的多库分离方法、系统及介质 | |
CN109993524A (zh) | 卡券管理方法、装置、设备及计算机可读存储介质 | |
CN107704573A (zh) | 一种与业务耦合的智能缓存方法 | |
CN106021566A (zh) | 一种提高单台数据库并发处理能力的方法、装置及系统 | |
CN109597574A (zh) | 分布式数据存储方法、服务器及可读存储介质 | |
CN103309696B (zh) | 一种Java卡扩展库更新方法、装置和Java卡 | |
CN110413679A (zh) | 数据库信息处理方法、装置、设备及可读存储介质 | |
CN102571381B (zh) | 一种信息存储方法以及信息存储装置 | |
CN110020297A (zh) | 一种网页内容的加载方法、装置及系统 | |
CN110134615B (zh) | 应用程序获取日志数据的方法及装置 | |
JP4249605B2 (ja) | クライアントサーバシステムおよびキャッシュ制御方法ならびにコンピュータプログラム | |
KR20170129540A (ko) | 룰 관리 시스템 및 방법 | |
CN110674173A (zh) | 一种风控云上的数据缓存的方法和系统 | |
CN112130894B (zh) | 一种应用特性开关的灰度发布管理系统、方法和设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |