CN115203209A - 基于hibernate拦截器的分表方法、装置、电子设备及存储介质 - Google Patents
基于hibernate拦截器的分表方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN115203209A CN115203209A CN202210875732.XA CN202210875732A CN115203209A CN 115203209 A CN115203209 A CN 115203209A CN 202210875732 A CN202210875732 A CN 202210875732A CN 115203209 A CN115203209 A CN 115203209A
- Authority
- CN
- China
- Prior art keywords
- sql statement
- name
- hibernate
- primary key
- splitting rule
- 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
Images
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/22—Indexing; Data structures therefor; Storage structures
- G06F16/221—Column-oriented storage; Management thereof
-
- 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/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
-
- 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/242—Query formulation
- G06F16/2433—Query languages
-
- 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/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Mathematical Physics (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种基于hibernate拦截器的分表方法、装置、电子设备及计算机存储介质,所述方法包括:通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;解析所述SQL语句,获取所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。如此,可通过非侵入式、不修改原代码且不依赖额外技术实现分表,提高了数据处理效率。
Description
技术领域
本发明涉及数据查询技术领域,特别是涉及一种基于hibernate拦截器的分表方法、装置、电子设备及计算机存储介质。
背景技术
在单表有上千万大数据场景下,对于数据库查询和插入性能降低问题,通过将历史数据拆分为多个数据表,使单一数据表的数据量减少,从而可提高实时业务存取数据的处理能力,保障业务服务的实时稳定性。然而,目前已有的分表方法都是侵入式解决方案,需要引用第三方技术,且数据处理效率低。
发明内容
本发明的目的在于提供一种基于hibernate拦截器的分表方法、装置、电子设备及计算机存储介质,通过非侵入式、不修改原代码且不依赖额外技术实现分表,提高了数据处理效率。
为达到上述目的,本发明的技术方案是这样实现的:
第一方面,本发明实施例提供了一种基于hibernate拦截器的分表方法,所述方法包括以下步骤:
通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;
解析所述SQL语句,获得所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;
在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;
将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。
作为其中一种实施方式,所述目标信息还包括操作类型;所述基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则之前,还包括:
检测所述操作类型是否为预设类型;
若是,则基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则的步骤。
作为其中一种实施方式,所述分表规则包括原表名、列名和操作条件;所述基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则,包括:
基于所述目标信息查找预先配置的至少一分表规则,获得原表名为待查询表名、列名为待查询列名的候选分表规则;
将与所述主键值相匹配的操作条件所对应的所述候选分表规则确定为与所述SQL语句匹配的目标分表规则。
作为其中一种实施方式,所述通过hibernate拦截器获取待执行的SQL语句以及对应的主键值,包括以下步骤:
配置hibernate拦截器,以新建自定义拦截类;
通过所述自定义拦截类获取待执行的SQL语句以及对应的主键值。
第二方面,本发明实施例提供了一种基于hibernate拦截器的分表装置,包括:
获取模块,用于通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;
解析模块,用于解析所述SQL语句,获取所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;
匹配模块,用于在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;
处理模块,用于将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。
作为其中一种实施方式,所述装置还包括检测模块,用于检测所述操作类型是否为预设类型,若是,则触发所述匹配模块执行相应处理。
作为其中一种实施方式,所述分表规则包括原表名、列名和操作条件;所述匹配模块,具体用于:
基于所述目标信息查找预先配置的至少一分表规则,获得原表名为待查询表名、列名为待查询列名的候选分表规则;
将与所述主键值相匹配的操作条件所对应的所述候选分表规则确定为与所述SQL语句匹配的目标分表规则。
作为其中一种实施方式,所述获取模块,具体用于:
配置hibernate拦截器,以新建自定义拦截类;
通过所述自定义拦截类获取待执行的SQL语句以及对应的主键值。
第三方面,本发明实施例提供了一种电子设备,包括:处理器和存储有计算机程序的存储器,在所述处理器运行所述计算机程序时,实现上述所述的基于hibernate拦截器的分表方法。
第四方面,本发明实施例提供了一种计算机存储介质,存储有计算机程序,所述计算机程序被处理器执行时,实现第一方面所述的基于hibernate拦截器的分表方法。
本发明实施例提供的基于hibernate拦截器的分表方法、装置、电子设备及计算机存储介质,包括:通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;解析所述SQL语句,获取所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。如此,可通过非侵入式、不修改原代码且不依赖额外技术实现分表,提高了数据处理效率。
附图说明
图1为本发明实施例提供的一种基于hibernate拦截器的分表方法的流程示意图;
图2为本发明实施例提供的一种基于hibernate拦截器的分表装置的结构示意图;
图3为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的设备和方法的例子。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者设备中还存在另外的相同要素,此外,本申请不同实施例中具有同样命名的部件、特征、要素可能具有相同含义,也可能具有不同含义,其具体含义需以其在该具体实施例中的解释或者进一步结合该具体实施例中上下文进行确定。
应当理解,尽管在本文可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本文范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语"如果"可以被解释成为"在……时"或"当……时"或"响应于确定"。再者,如同在本文中所使用的,单数形式“一”、“一个”和“该”旨在也包括复数形式,除非上下文中有相反的指示。应当进一步理解,术语“包含”、“包括”表明存在所述的特征、步骤、操作、元件、组件、项目、种类、和/或组,但不排除一个或多个其他特征、步骤、操作、元件、组件、项目、种类、和/或组的存在、出现或添加。此处使用的术语“或”和“和/或”被解释为包括性的,或意味着任一个或任何组合。因此,“A、B或C”或者“A、B和/或C”意味着“以下任一个:A;B;C;A和B;A和C;B和C;A、B和C”。仅当元件、功能、步骤或操作的组合在某些方式下内在地互相排斥时,才会出现该定义的例外。
应该理解的是,虽然本申请实施例中的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
需要说明的是,在本文中,采用了诸如S101、S102等步骤代号,其目的是为了更清楚简要地表述相应内容,不构成顺序上的实质性限制,本领域技术人员在具体实施时,可能会先执行S102后执行S101等,但这些均应在本申请的保护范围之内。
应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或者“单元”的后缀仅为了有利于本申请的说明,其本身没有特定的意义。因此,“模块”、“部件”或者“单元”可以混合地使用。
参阅图1,为本申请实施例提供的一种基于hibernate拦截器的分表方法,该方法可以适用于分表的情况,该方法可以由本申请实施例提供的一种基于hibernate拦截器的分表装置来执行,该装置可以采用软件和/或硬件的方式来实现,在具体应用中,该装置可以具体是终端等电子设备。本实施例中以所述基于hibernate拦截器的分表方法的执行主体为电子设备为例,本实施例提供的基于hibernate拦截器的分表方法包括以下步骤:
步骤S101:通过hibernate拦截器获取待执行的SQL语句以及对应的主键值。
可选地,可预先在电子设备中配置hibernate拦截器,以通过所述hibernate拦截器获取待执行的SQL语句以及对应的主键值。可选地,所述通过hibernate拦截器获取待执行的SQL语句以及对应的主键值,包括以下步骤:配置hibernate拦截器,以新建自定义拦截类;通过所述自定义拦截类获取待执行的SQL语句以及对应的主键值。其中,所述配置hibernate拦截器,以新建自定义拦截类,可以为配置hibernate拦截器,在编辑器新建JpaInterceptor自定义拦截类,继承org.hibernate.EmptyInterceptor父类,编辑application.properties的spring.jpa.properties.hibernate.session_factory.interceptor=JpaInterceptor类。同时,在Java项目新建一个JpaInterceptor.java文件,导入org.hibernate.EmptyInterceptor包,继承(extends)EmptyInterceptor父类。这里,可通过JpaInterceptor类java重写getEntity方法获取查询的主键值。此外,在获取所述主键值后,将所述主键值放入Java的线程局部变量(ThreadLocal)中,以通过线程上下文来传递主键值。
可选地,在电子设备启动或运行应用程序后,用户可对所述应用程序进行操作,从而产生待执行的SQL语句,进而由hibernate拦截器获取待执行的SQL语句以及对应的主键值。需要说明的是,所述主键值是唯一的,也可称为唯一主键id。
步骤S102:解析所述SQL语句,获得所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名。
这里,通过对所述SQL语句进行解析,可获得所述SQL语句中包含的待查询表名和待查询列名,所述待查询表名用于指示所述SQL语句所要查询的数据表,而所述待查询列名用于指示所述SQL语句所要查询的数据表中所在的列。可选地,所述所述SQL语句还可包括操作类型,即所述目标信息还可包括操作类型,所述操作类型用于指示所述SQL语句将要执行的操作。
步骤S103:在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则。
具体地,电子设备在所述待查询列名为主键时,基于所述目标信息和所述主键值查询预先配置的至少一分表规则,以从所述至少一分表规则中确定与所述SQL语句匹配的目标分表规则。需要说明的是,所述分表规则是预先在application.properties配置的,可包括原表名、新表名、列名和操作条件等。例如,可配置分表规则为“tableName=user;newTableName=user1;column=id;operator=<;value=5”,其中,tableName是原表名,newTableName是新表名,column是列名,即字段名,operator是满足的条件判断符号,value是满足的值。因此,基于所述目标信息和所述主键值,可检测预先配置的至少一分表规则中是否存在与所述SQL语句匹配的目标分表规则。
可选地,所述分表规则包括原表名、列名和操作条件;所述基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则,包括:
基于所述目标信息查找预先配置的至少一分表规则,获得原表名为待查询表名、列名为待查询列名的候选分表规则;
将与所述主键值相匹配的操作条件所对应的所述候选分表规则确定为与所述SQL语句匹配的目标分表规则。
可选地,针对每个预先配置的分表规则,可获取该分表规则的原表名和列名等信息,接着,将原表名为所述待查询表名、列名为所述待查询列名的分表规则作为候选分表规则,进而将所述主键值与各候选分表规则中的操作条件进行匹配,若操作条件与所述主键值相匹配,则将对应的候选分表规则候选分表规则。例如,假设所述SQL语句中的待查询表名为“TableName=user”、待查询列名为“column=id”以及主键值为“id=3”,若分表规则A为“tableName=user;newTableName=user1;column=id;operator=<;value=5”,分表规则B为“tableName=user;newTableName=user2;column=id;operator=<;value=10”,则可将分表规则A确定为与所述SQL语句匹配的分表规则。如此,可实现准确且快速确定分表规则,进一步提高了数据处理效率。
可选地,所述目标信息还包括操作类型;所述基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则之前,还包括:
检测所述操作类型是否为预设类型;
若是,则基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则的步骤。
可选地,所述预设类型可以根据实际情况需要进行设置,比如可以为查询类型。例如,假设所述预设类型为查询类型,即stat应为select,若所述SQL语句为“select*fromabc where id=?”,由于在所述SQL语句中stat=select,则确定所述SQL语句操作类型为预设类型。
步骤S104:将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。
具体地,电子设备在确定与所述SQL语句匹配的目标分表规则后,将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句,以对所述新表名对应的数据表进行相应处理。
综上,上述实施例提供的基于hibernate拦截器的分表方法中,可通过非侵入式、不修改原代码且不依赖额外技术实现分表,提高了数据处理效率。
基于前述实施例相同的发明构思,参阅图2,为本申请实施例提供的一种基于hibernate拦截器的分表装置,包括:
获取模块,用于通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;
解析模块,用于解析所述SQL语句,获取所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;
匹配模块,用于在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;
处理模块,用于将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。
可选地,可预先在电子设备中配置hibernate拦截器,以通过所述hibernate拦截器获取待执行的SQL语句以及对应的主键值。可选地,所述获取模块,具体用于:配置hibernate拦截器,以新建自定义拦截类;通过所述自定义拦截类获取待执行的SQL语句以及对应的主键值。
其中,所述配置hibernate拦截器,以新建自定义拦截类,可以为配置hibernate拦截器,在编辑器新建JpaInterceptor自定义拦截类,继承org.hibernate.EmptyInterceptor父类,编辑application.properties的spring.jpa.properties.hibernate.session_factory.interceptor=JpaInterceptor类。同时,在Java项目新建一个JpaInterceptor.java文件,导入org.hibernate.EmptyInterceptor包,继承(extends)EmptyInterceptor父类。这里,可通过JpaInterceptor类java重写getEntity方法获取查询的主键值。此外,在获取所述主键值后,将所述主键值放入Java的线程局部变量(ThreadLocal)中,以通过线程上下文来传递主键值。
可选地,在电子设备启动或运行应用程序后,用户可对所述应用程序进行操作,从而产生待执行的SQL语句,进而由hibernate拦截器获取待执行的SQL语句以及对应的主键值。需要说明的是,所述主键值是唯一的,也可称为唯一主键id。
这里,通过对所述SQL语句进行解析,可获得所述SQL语句中包含的待查询表名和待查询列名,所述待查询表名用于指示所述SQL语句所要查询的数据表,而所述待查询列名用于指示所述SQL语句所要查询的数据表中所在的列。可选地,所述所述SQL语句还可包括操作类型,即所述目标信息还可包括操作类型,所述操作类型用于指示所述SQL语句将要执行的操作。
这里,在所述待查询列名为主键时,基于所述目标信息和所述主键值查询预先配置的至少一分表规则,以从所述至少一分表规则中确定与所述SQL语句匹配的目标分表规则。需要说明的是,所述分表规则是预先在application.properties配置的,可包括原表名、新表名、列名和操作条件等。例如,可配置分表规则为“tableName=user;newTableName=user1;column=id;operator=<;value=5”,其中,tableName是原表名,newTableName是新表名,column是列名,即字段名,operator是满足的条件判断符号,value是满足的值。因此,基于所述目标信息和所述主键值,可检测预先配置的至少一分表规则中是否存在与所述SQL语句匹配的目标分表规则。
可选地,所述匹配模块,具体用于:
基于所述目标信息查找预先配置的至少一分表规则,获得原表名为待查询表名、列名为待查询列名的候选分表规则;
将与所述主键值相匹配的操作条件所对应的所述候选分表规则确定为与所述SQL语句匹配的目标分表规则。
可选地,针对每个预先配置的分表规则,可获取该分表规则的原表名和列名等信息,接着,将原表名为所述待查询表名、列名为所述待查询列名的分表规则作为候选分表规则,进而将所述主键值与各候选分表规则中的操作条件进行匹配,若操作条件与所述主键值相匹配,则将对应的候选分表规则候选分表规则。例如,假设所述SQL语句中的待查询表名为“TableName=user”、待查询列名为“column=id”以及主键值为“id=3”,若分表规则A为“tableName=user;newTableName=user1;column=id;operator=<;value=5”,分表规则B为“tableName=user;newTableName=user2;column=id;operator=<;value=10”,则可将分表规则A确定为与所述SQL语句匹配的分表规则。如此,可实现准确且快速确定分表规则,进一步提高了数据处理效率。
可选地,所述目标信息还包括操作类型;所述装置还包括检测模块,用于检测所述操作类型是否为预设类型,若是,则触发所述匹配模块执行相应处理。
可选地,所述预设类型可以根据实际情况需要进行设置,比如可以为查询类型。例如,假设所述预设类型为查询类型,即stat应为select,若所述SQL语句为“select*fromabc where id=?”,由于在所述SQL语句中stat=select,则确定所述SQL语句操作类型为预设类型。
可选地,在确定与所述SQL语句匹配的目标分表规则后,所述处理模块将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句,以对所述新表名对应的数据表进行相应处理。
综上,上述实施例提供的基于hibernate拦截器的分表装置中,可通过非侵入式、不修改原代码且不依赖额外技术实现分表,提高了数据处理效率。
基于前述实施例相同的发明构思,下面通过具体场景对前述实施例进行具体说明。
本实施例提供的基于hibernate拦截器的分表方法的主要过程如下:
1)首先,配置hibernate拦截器,在编辑器新建JpaInterceptor自定义拦截类,继承org.hibernate.EmptyInterceptor父类,编辑application.properties的spring.jpa.properties.hibernate.session_factory.interceptor=JpaInterceptor类。
Java项目新建一个JpaInterceptor.java文件,导入org.hibernate.EmptyInterceptor包,继承(extends)EmptyInterceptor父类。
代码结构如下:
@Component
public class JpaInterceptor extends EmptyInterceptor{
}
在hibernate中,一个java对象有不同阶段的生命周期。hibernate提供了一个拦截器,可在不同的阶段回调设定好的回调函数以及方法,这种回调机制可以允许应用程序在持久化对象被保存、更新、删除或是加载之前,检查并(或)修改其属性。
2)JpaInterceptor类java重写getEntity方法获取查询的id。
java重写的解释:重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,即外壳不变,核心重写。
代码结构如下:
getEntity方法有2个形参,第二个形参是id。本实施例中以id=3为例。
由于在SQL执行之前需要判断对象的唯一主键id,用来匹配对应的分表规则。为了解决不调整原代码低成本非侵入式查询分表的问题,重新getEntity方法是用来获取查询对象的唯一主键id。
3)通过线程上下文来传递id,为了传递id给下面的onPrepareStatement,将获取的id放入java的ThreadLocal。
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,使用这个工具类可以很简洁地编写出优美的多线程程序。在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal<T>。泛型里定义Long类型,通过ThreadLocal的.set()方法设置id,只要在同一个线程内的调用链的方法都能通过get()方法获取到前面放进去的id,这样方便后面的方法拿到id匹配分表规则。
4)JpaInterceptor类重写onPrepareStatement方法利用SQLUtils解析出SQL语句的表名、子句和条件。
代码结构如下:
@Override
public String onPrepareStatement(String sql){
}
onPrepareStatement方法即在预编译SQL时会调用该方法,以拿到即将执行的SQL语句
比如,SQL语句为“select*fromuserwhereid=?”,这里,hibernate使用的预编译SQL语句和占位符参数(在jdbc中是“?”),用来防止SQL注入攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中,所以这里拿不到真实的id的值,只能显示“?”号。
为了匹配分表策略即分表规则,需要对SQL进行解析,以获得SQL的结构,
代码结构如下:
SQLStatement sqlStatement=SQLUtils.parseSingleStatement(sql,JdbcConstants.MYSQL);
sqlStatement.accept(visitor);
String tableName=visitor.getOriginalTables().get(0).toString();
String stat=visitor.getTableStat(tableName).toString();
List<TableStat.Condition>conditions=visitor.getConditions();
其中,tableName是SQL的表名,这里得到是User。
stat是SQL表达式的子句(即操作类型),这里得到的是select。
conditions是拿到的所有条件,这里得到的是Condition对象。
通过遍历conditions集合,拿到每一条的条件,比如where id=?andname=?,就能分别得到id=3和name=“张三”。
String column=condition.getColumn().getName();
String value=condition.getValues().get(0);
column是字段名,这里拿到的是id。
5)配置分表规则,其中分表规则可在application.properties里配置:configJson=[{"tableName":"user","newTableName":"user1","condition":[{"column":"id","operator":"<","value":"5"}]},{"tableName":"user","newTableName":"user2","condition":[{"column":"id","operator":"<","value":"10"}]}]
定义的字符串是标准的JSON数组,可以配置多个,tableName是原表名,newTableName是新表名,condition是满足条件,column是条件的字段名,operator是满足的条件判断符号,value是满足的值。
在SpringBoot框架的项目里,只需要在application.properties文件配置字符串,可以在任何类里通过@Value("${configJson}")获取。
6)根据获取的配置的分表规则和解析SQL的结果,判断是否匹配并满足要求,满足条件替换原表名为分表规则的新表名。
例如,假设通过fastjson工具包JSONArray.parseArray(configStaticJson),得到2个配置的分表规则,即分表规则A:tableName=user;newTableName=user1;column=id;operator=<;value=5;分表规则B:tableName=user;newTableName=user2;column=id;operator=<;value=10;解析SQL的String tableName=user,String stat=select,String column=id,并且通过idThreadLocal.get()获取的id=3,则执行以下条件匹配:
条件001:判断SQL结构stat是否是select,用来过滤只处理select语句;
条件002:判断分表规则的tableName是否等于SQL结构tableName;
条件003:判断分表规则的column和SQL结构column是否一致;
条件004:判断分表规则的operator条件,判断id是否满足;
条件005:如果满足以上所有条件,就替换当前表名tableName为新表名newTableName;否则,不修改。
由于id=3正好满足分表规则A,则替换字符串sql=sql.replace(tableName,newTableName);最终达到修改分表SQL为select*from user1where id=?。
而存在以下情况则不修改原表名:
若SQL语句为“update user set name=’李四’where id=?”,由于update不符合条件001,update是更新语句,即解析SQL结构stat=update,不是select。不修改原表名。
若SQL语句为“select*from abc where id=?”,由于abc表名不符合条件002,而配置的分表规则里都是user,不修改原表名。
若SQL语句为“select*from user where and id=?”且id=12,由于id=12不符合条件004,即配置的分表规则中分表规则A要求小于5,分表规则B要求10均不满足,不修改原表名。
综上,本实施例提供的基于hibernate拦截器的分表方法中,解决了非侵入式、无需修改原代码、不用依赖额外技术实现分表的问题,并通过hibernate拦截器达到分表的效果。
基于前述实施例相同的发明构思,本发明实施例提供了一种电子设备,如图3所示,该电子设备包括:处理器310和存储有计算机程序的存储器311;其中,图3中示意的处理器310并非用于指代处理器310的个数为一个,而是仅用于指代处理器310相对其他器件的位置关系,在实际应用中,处理器310的个数可以为一个或多个;同样,图3中示意的存储器311也是同样的含义,即仅用于指代存储器311相对其他器件的位置关系,在实际应用中,存储器311的个数可以为一个或多个。在所述处理器310运行所述计算机程序时,实现应用于上述电子设备的所述基于hibernate拦截器的分表方法。
该电子设备还可包括:至少一个网络接口312。该电子设备中的各个组件通过总线系统313耦合在一起。可理解,总线系统313用于实现这些组件之间的连接通信。总线系统313除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图3中将各种总线都标为总线系统313。
其中,存储器311可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(ROM,Read Only Memory)、可编程只读存储器(PROM,Programmable Read-Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read-Only Memory)、电可擦除可编程只读存储器(EEPROM,Electrically Erasable Programmable Read-Only Memory)、磁性随机存取存储器(FRAM,ferromagnetic random access memory)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(CD-ROM,Compact Disc Read-Only Memory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(RAM,Random AccessMemory),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(SRAM,Static Random Access Memory)、同步静态随机存取存储器(SSRAM,Synchronous Static Random Access Memory)、动态随机存取存储器(DRAM,Dynamic Random Access Memory)、同步动态随机存取存储器(SDRAM,SynchronousDynamic Random Access Memory)、双倍数据速率同步动态随机存取存储器(DDRSDRAM,Double Data Rate Synchronous Dynamic Random Access Memory)、增强型同步动态随机存取存储器(ESDRAM,Enhanced Synchronous Dynamic Random Access Memory)、同步连接动态随机存取存储器(SLDRAM,SyncLink Dynamic Random Access Memory)、直接内存总线随机存取存储器(DRRAM,Direct Rambus Random Access Memory)。本发明实施例描述的存储器311旨在包括但不限于这些和任意其它适合类型的存储器。
本发明实施例中的存储器311用于存储各种类型的数据以支持该电子设备的操作。这些数据的示例包括:用于在该电子设备上操作的任何计算机程序,如操作系统和应用程序;联系人数据;电话簿数据;消息;图片;视频等。其中,操作系统包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序可以包含各种应用程序,例如媒体播放器(Media Player)、浏览器(Browser)等,用于实现各种应用业务。这里,实现本发明实施例方法的程序可以包含在应用程序中。
基于前述实施例相同的发明构思,本实施例还提供了一种计算机存储介质,所述计算机存储介质中存储有计算机程序,计算机存储介质可以是磁性随机存取存储器(FRAM,ferromagnetic random access memory)、只读存储器(ROM,Read Only Memory)、可编程只读存储器(PROM,Programmable Read-Only Memory)、可擦除可编程只读存储器(EPROM,Erasable Programmable Read-Only Memory)、电可擦除可编程只读存储器(EEPROM,Electrically Erasable Programmable Read-Only Memory)、快闪存储器(FlashMemory)、磁表面存储器、光盘、或只读光盘(CD-ROM,Compact Disc Read-Only Memory)等存储器;也可以是包括上述存储器之一或任意组合的各种设备,如移动电话、计算机、平板设备、个人数字助理等。所述计算机存储介质中存储的计算机程序被处理器运行时,实现应用于上述电子设备的所述基于hibernate拦截器的分表方法。所述计算机程序被处理器执行时实现的具体步骤流程请参考图1所示实施例的描述,在此不再赘述。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,除了包含所列的那些要素,而且还可包含没有明确列出的其他要素。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种基于hibernate拦截器的分表方法,其特征在于,所述方法包括以下步骤:
通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;
解析所述SQL语句,获得所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;
在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;
将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。
2.根据权利要求1所述的基于hibernate拦截器的分表方法,其特征在于,所述目标信息还包括操作类型;所述基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则之前,还包括:
检测所述操作类型是否为预设类型;
若是,则基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则的步骤。
3.根据权利要求1或2所述的基于hibernate拦截器的分表方法,其特征在于,所述分表规则包括原表名、列名和操作条件;所述基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则,包括:
基于所述目标信息查找预先配置的至少一分表规则,获得原表名为待查询表名、列名为待查询列名的候选分表规则;
将与所述主键值相匹配的操作条件所对应的所述候选分表规则确定为与所述SQL语句匹配的目标分表规则。
4.根据权利要求1或2所述的基于hibernate拦截器的分表方法,其特征在于,所述通过hibernate拦截器获取待执行的SQL语句以及对应的主键值,包括以下步骤:
配置hibernate拦截器,以新建自定义拦截类;
通过所述自定义拦截类获取待执行的SQL语句以及对应的主键值。
5.一种基于hibernate拦截器的分表装置,其特征在于,所述装置包括:
获取模块,用于通过hibernate拦截器获取待执行的SQL语句以及对应的主键值;
解析模块,用于解析所述SQL语句,获取所述SQL语句中的目标信息,所述目标信息包括待查询表名和待查询列名;
匹配模块,用于在所述待查询列名为主键时,基于所述目标信息和所述主键值,从预先配置的至少一分表规则中确定与所述SQL语句匹配的目标分表规则;
处理模块,用于将所述SQL语句中的所述待查询表名替换为所述目标分表规则中的新表名,并执行处理后的所述SQL语句。
6.根据权利要求5所述的基于hibernate拦截器的分表装置,其特征在于,所述装置还包括检测模块,用于检测所述操作类型是否为预设类型,若是,则触发所述匹配模块执行相应处理。
7.根据权利要求5或6所述的基于hibernate拦截器的分表装置,其特征在于,所述分表规则包括原表名、列名和操作条件;所述匹配模块,具体用于:
基于所述目标信息查找预先配置的至少一分表规则,获得原表名为待查询表名、列名为待查询列名的候选分表规则;
将与所述主键值相匹配的操作条件所对应的所述候选分表规则确定为与所述SQL语句匹配的目标分表规则。
8.根据权利要求5或6所述的基于hibernate拦截器的分表装置,其特征在于,所述获取模块,具体用于:
配置hibernate拦截器,以新建自定义拦截类;
通过所述自定义拦截类获取待执行的SQL语句以及对应的所述主键值。
9.一种电子设备,其特征在于,包括:处理器和存储有计算机程序的存储器,在所述处理器运行所述计算机程序时,实现权利要求1至4中任一项所述的基于hibernate拦截器的分表方法。
10.一种计算机存储介质,其特征在于,存储有计算机程序,所述计算机程序被处理器执行时,实现权利要求1至4中任一项所述的基于hibernate拦截器的分表方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210875732.XA CN115203209A (zh) | 2022-07-25 | 2022-07-25 | 基于hibernate拦截器的分表方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210875732.XA CN115203209A (zh) | 2022-07-25 | 2022-07-25 | 基于hibernate拦截器的分表方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115203209A true CN115203209A (zh) | 2022-10-18 |
Family
ID=83583319
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210875732.XA Pending CN115203209A (zh) | 2022-07-25 | 2022-07-25 | 基于hibernate拦截器的分表方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115203209A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117648326A (zh) * | 2024-01-29 | 2024-03-05 | 中邮消费金融有限公司 | 动态分表方法、装置、设备及存储介质 |
CN118394279A (zh) * | 2024-06-20 | 2024-07-26 | 杭州玳数科技有限公司 | 一种基于拦截器的数据处理方法、设备、存储介质及计算机程序产品 |
-
2022
- 2022-07-25 CN CN202210875732.XA patent/CN115203209A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117648326A (zh) * | 2024-01-29 | 2024-03-05 | 中邮消费金融有限公司 | 动态分表方法、装置、设备及存储介质 |
CN117648326B (zh) * | 2024-01-29 | 2024-05-10 | 中邮消费金融有限公司 | 动态分表方法、装置、设备及存储介质 |
CN118394279A (zh) * | 2024-06-20 | 2024-07-26 | 杭州玳数科技有限公司 | 一种基于拦截器的数据处理方法、设备、存储介质及计算机程序产品 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107038207B (zh) | 一种数据查询方法、数据处理方法及装置 | |
CN107526777B (zh) | 一种基于版本号对文件进行处理的方法及设备 | |
CN115203209A (zh) | 基于hibernate拦截器的分表方法、装置、电子设备及存储介质 | |
US20160171978A1 (en) | Voice recognition system and construction method thereof | |
CN106951231B (zh) | 一种计算机软件开发方法及装置 | |
US20200142674A1 (en) | Extracting web api endpoint data from source code | |
CN113094387A (zh) | 一种数据查询方法、装置、电子设备及机器可读存储介质 | |
CN115729951B (zh) | 数据查询方法、系统、设备及计算机可读存储介质 | |
US20240256613A1 (en) | Data processing method and apparatus, readable storage medium, and electronic device | |
JP2005050347A (ja) | 実行時バインディング/動的パス名解決の方法および装置 | |
CN115617799A (zh) | 一种数据存储的方法、装置、设备及存储介质 | |
CN115098062A (zh) | 一种代码生成方法及装置 | |
CN108959294B (zh) | 一种访问搜索引擎的方法和装置 | |
CN112579705B (zh) | 元数据采集方法、装置、计算机设备和存储介质 | |
CN106156050B (zh) | 一种数据处理方法及装置 | |
CN112597350B (zh) | 参数核验方法、系统及计算机存储介质 | |
CN112434037A (zh) | 数据处理方法、处理装置、数据处理设备和存储介质 | |
CN109697234B (zh) | 实体的多属性信息查询方法、装置、服务器和介质 | |
US12001458B2 (en) | Multi-cloud object store access | |
WO2023030461A1 (zh) | 一种分布式数据库检测方法及装置 | |
CN111666278A (zh) | 数据存储、检索方法、电子设备及存储介质 | |
US20230138113A1 (en) | System for retrieval of large datasets in cloud environments | |
CN112416966A (zh) | 即席查询方法、装置、计算机设备和存储介质 | |
CN104239576A (zh) | 查找HBase表列值中所有行的方法和装置 | |
CN111090670A (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 |