CN103164455B - 数据库的优化方法及装置 - Google Patents
数据库的优化方法及装置 Download PDFInfo
- Publication number
- CN103164455B CN103164455B CN201110421548.XA CN201110421548A CN103164455B CN 103164455 B CN103164455 B CN 103164455B CN 201110421548 A CN201110421548 A CN 201110421548A CN 103164455 B CN103164455 B CN 103164455B
- Authority
- CN
- China
- Prior art keywords
- data base
- code
- statement
- database
- category information
- 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.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出了一种数据库的优化方法,包括以下步骤:获得虚拟机装载前的类信息,并对所述类信息进行分析以确定所述类信息中的数据库驱动类信息;在所述数据库驱动类信息之中织入第一代码及第一操作类代码;根据所述织入的第一代码及第一操作类代码获取数据库操作语句;以及根据所述数据库操作语句对所述数据库进行优化。本发明可以在无侵入的情况下对数据库操作语句进行拦截,并进一步根据拦截获得的数据库操作语句对数据库进行优化,从而提升数据库性能。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种数据库的优化方法及装置。
背景技术
JDBC(JavaDataBaseConnectivity,Java数据库连接)是一种用于执行SQL(StructuredQueryLanguage,结构化查询语言)语句的JavaAPI(ApplicationProgrammingInterface,应用程序编程接口),可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。有了JDBCAPI,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBCAPI,就不必为访问Sybase数据库专门编写一个程序,为访问Oracle数据库又专门编写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBCAPI写一个程序就够了,它可向相应数据库发送SQL调用。
目前,基于SQL语句的优化分析技术主要都基于代码侵入式或利用Java反射技术进行实现,例如p6spy产品等。现有技术的缺点是目前基于SQL语句的优化分析技术都需要修改JDBC连接驱动配置,不仅操作复杂,而且导致数据库的稳定性及安全性均有所降低。
发明内容
本发明旨在至少解决现有技术中存在的技术问题之一,特别是解决需要对JDBC连接驱动配置进行修改才能够获得SQL语句的缺陷。
本发明实施例第一方面提出了一种数据库的优化方法,包括以下步骤:获得虚拟机装载前的类信息,并对所述类信息进行分析以确定所述类信息中的数据库驱动类信息;在所述数据库驱动类信息之中织入第一代码及第一操作类代码;根据所述织入的第一代码及第一操作类代码获取数据库操作语句;以及根据所述数据库操作语句对所述数据库进行优化。
在本发明的一个实施例中,上述优化可为数据库的索引优化或大数据集优化。
本发明实施例第二方面还提出了一种数据库的优化***,包括虚拟机、虚拟机代理及数据库连接器,其中,所述虚拟机,用于根据用户的指令生成类信息,并由所述虚拟机代理织入第一代码及第一操作类代码的所述数据库驱动类信息进行装载;虚拟机代理,用于获得虚拟机装载前的类信息,并对所述类信息进行分析以确定所述类信息中的数据库驱动类信息,以及在所述数据库驱动类信息之中织入第一代码及第一操作类代码,并通过所述虚拟机代理将所述虚拟机装载后的所述数据库驱动类信息发送至数据库连接器;所述数据库连接器,用于对所述装载后的数据库驱动类信息进行转换并发送至数据库,并通过所述第一操作类代码执行所述第一代码以获取所述数据库操作语句,以及根据所述数据库操作语句对所述数据库进行优化。
在本发明的一个实施例中,上述优化可为数据库的索引优化或大数据集优化。
在本发明的上述实施例中,通过上述虚拟机代理无缝地织入的第一代码及第一操作类代码,可以在无侵入的情况下对数据库操作语句(例如SQL语句)进行拦截,并进一步根据拦截获得的数据库操作语句对数据库进行优化,从而提升数据库性能。
本发明实施例第三方面还提出了一种数据库操作语句的获取方法,包括以下步骤:获得虚拟机装载前的类信息;对所述类信息进行分析以确定所述类信息中的数据库驱动类信息;在所述数据库驱动类信息之中织入第一代码及第一操作类代码;根据所述织入的第一代码及第一操作类代码获取数据库操作语句。
在本发明的上述实施例中,通过上述虚拟机代理无缝地织入的第一代码及第一操作类代码,可以在无侵入的情况下对数据库操作语句(例如SQL语句)进行拦截,因此无需对JDBC的连接驱动配置进行修改,从而提高了数据库的安全性和稳定性。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明实施例的数据库的优化方法的流程图;
图2为本发明实施例织入第一操作类代码及第一代码的示意图;
图3为本发明实施例对数据库进行索引优化的方法示意图;
图4为本发明实施例数据库返回解释语句的结果集的例子;
图5为本发明实施例对数据库进行大数据集优化的方法示意图;
图6为本发明实施例织入第一操作类代码、第一代码及第二操作类代码和第二代码的示意图;
图7a和7b分别为大数据集优化前和优化后的操作示意图;
图8为本发明实施例数据库的优化***的结构图;
图9为本发明实施例的用于数据库索引优化的数据库连接器的结构图;
图10为本发明实施例的用于数据库大数据集优化的数据库连接器的结构图;以及
图11为本发明实施例的数据库操作语句的获取方法流程图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
参照下面的描述和附图,将清楚本发明的实施例的这些和其他方面。在这些描述和附图中,具体公开了本发明的实施例中的一些特定实施方式,来表示实施本发明的实施例的原理的一些方式,但是应当理解,本发明的实施例的范围不受此限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
如图1所示,为本发明实施例的数据库的优化方法的流程图。该方法包括以下步骤:
步骤S101,虚拟机代理(agent)获得虚拟机装载前的类信息。在本发明的实施例中,虚拟机可为Java虚拟机。在目前的Java虚拟机技术中,虚拟机代理提供一个功能,可以得到Java类装载前的类信息。具体地,该类信息以字节码的形式存在。在本发明的一个实施例中,这些类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。其中,java.lang.ClassLoader是装载类的类,所有的类信息都通过java.lang.ClassLoader类装载到内存之中。本发明正是采用虚拟机代理能够获得虚拟机通过java.lang.ClassLoader类装载之前的类信息这一特性,来实现本发明实施例代码的无缝动态织入。从而进一步实现在不修改JDBC连接驱动配置的基础上实现数据库操作语句的获取。
本发明的实施例可适于JDBC相连的各种数据库,例如Mysql数据库、Informix数据库、Oracle数据库、Sybase数据库等。在本发明的以下实施例中,将以Mysql数据库为例进行描述,但本领域技术人员应当理解的是,本发明实施例还可用于上述已知的或者今后发展的任何数据库,只要该数据库能够被JDBC支持即可。
步骤S102,虚拟机代理对类信息进行分析以确定类信息中的数据库驱动类信息。具体地,虚拟机代理对所有类信息进行分析,根据类信息的类名、包名等进行过滤,以在这些类信息之中确定数据库驱动类信息。在本发明的实施例中,以Mysql数据库为例的话,可以找到Mysql驱动的特定类com.mysql.jdbc.Driver,从而识别Mysql驱动的加载。在本发明的其他实施例中,对于其他不同类型的数据库,也可选择其他数据库驱动的特定的类,在此不再一一赘述。
步骤S103,虚拟机代理在数据库驱动类信息之中织入第一代码及第一操作类代码,其中,第一操作类代码为执行第一代码的指令的代码,第一代码用于在被执行时获取数据库驱动类信息中的数据库操作语句。在本发明的一个实施例中,依然以Mysql数据库为例,其中,第一操作类代码可为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码。如图2所示,为本发明实施例织入第一操作类代码及第一代码的示意图。在本发明的实施例中,第一操作类代码和第一代码应在数据库操作语句执行之前执行,通过第一操作类代码执行该第一代码。因此从图中可以看出,第一操作类代码和第一代码介于ClassStatementImpl和MethodStatementImpl之间,从而使得第一操作类代码和第一代码限于数据库操作语句而被数据库连接器所执行。
步骤S104,虚拟机将织入第一代码及第一操作类代码的数据库驱动类信息进行装载,并通过虚拟机代理将装载后的数据库驱动类信息发送至数据库连接器。在本发明的实施例中,虚拟机可通过核心类java.lang.ClassLoader对织入第一代码及第一操作类代码的数据库驱动类信息进行装载,将其装载至内存。在本发明的实施例中,该数据库连接器可为Java数据库连接器,即JDBC。
步骤S105,数据库连接器对装载后的数据库驱动类信息进行转换并发送至数据库,并通过第一操作类代码执行第一代码以获取数据库操作语句。数据库连接器在对数据库驱动类信息进行转换前,会先通过第一操作类代码执行第一代码以获取数据库操作语句。在获取数据库操作语句之后,完成转换并将转换后的信息发送至数据库,数据库可按照正常流程处理。
步骤S106,数据库连接器根据数据库操作语句对数据库进行优化。在本发明的实施例中,可对数据库进行索引优化或大数据集优化等。在以下的实施例中,将分别对索引优化及大数据集优化进行详细介绍。但本领域技术人员应当理解的是,索引优化及大数据集优化仅为本发明的优选实施例,本领域技术人员在获得数据库操作语句之后还可根据数据库操作语句,及以下索引优化及大数据集优化的思想完成其他对数据库的优化,这些也均应包含在本发明实施例的包含范围之内。
在本发明的上述实施例中,通过上述虚拟机代理无缝地织入的第一代码及第一操作类代码,可以在无侵入的情况下对数据库操作语句(例如SQL语句)进行拦截,并进一步根据拦截获得的数据库操作语句对数据库进行优化,从而提升数据库性能。
如图3所示,为本发明实施例对数据库进行索引优化的方法示意图。该方法包括以下步骤:
步骤S301,虚拟机代理获得虚拟机装载前的类信息。在本发明的实施例中,虚拟机可为Java虚拟机。具体地,该类信息以字节码的形式存在。在本发明的一个实施例中,这些类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。其中,java.lang.ClassLoader是装载类的类,所有的类信息都通过java.lang.ClassLoader类装载到内存之中。本发明的实施例可适于JDBC相连的各种数据库,例如Mysql数据库、Informix数据库、Oracle数据库、Sybase数据库等。
步骤S302,虚拟机代理对类信息进行分析以确定类信息中的数据库驱动类信息。具体地,虚拟机代理对所有类信息进行分析,根据类信息的类名、包名等进行过滤,以在这些类信息之中确定数据库驱动类信息。
步骤S303,虚拟机代理在数据库驱动类信息之中织入第一代码及第一操作类代码,其中,第一操作类代码为执行第一代码的指令的代码,第一代码用于在被执行时获取数据库驱动类信息中的数据库操作语句。在本发明的一个实施例中,依然以Mysql数据库为例,其中,第一操作类代码可为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码。在本发明的实施例中,第一操作类代码和第一代码应在数据库操作语句执行之前执行,通过第一操作类代码执行该第一代码。
步骤S304,虚拟机将织入第一代码及第一操作类代码的数据库驱动类信息进行装载,并通过虚拟机代理将装载后的数据库驱动类信息发送至数据库连接器。在本发明的实施例中,虚拟机可通过核心类java.lang.ClassLoader对织入第一代码及第一操作类代码的数据库驱动类信息进行装载,将其装载至内存。
步骤S305,数据库连接器对装载后的数据库驱动类信息进行转换并发送至数据库,并通过第一操作类代码执行第一代码以获取数据库操作语句。数据库连接器在对数据库驱动类信息进行转换前,会先通过第一操作类代码执行第一代码以获取数据库操作语句。
步骤S306,数据库连接器判断数据库操作语句是否为数据库查询语句。在本发明的一个实施例中,以SQL语句(数据库操作语句)为例,可通过对关键字“SELECT”包含的匹配方式检查该数据库操作语句是否为查询语句,如果包含关键字“SELECT”,则表示当前的语句是查询语句。如果判断不为查询语句,则不需进行索引优化,按照现有流程处理即可,在此不再赘述。
步骤S307,如果为数据库查询语句,则数据库连接器根据数据库操作语句生成数据库操作语句的解释语句。当确定当前的SQL语句为查询语句后,则开始对该语句进行索引使用情况进行分析。首先通过数据库提供的explain命令,对SQL语句进行改写,例如,SQL语句为Select*fromstuentwherename=”;改写后的SQL语句的解释语句即为explainselect*fromstudentwherename=”。
步骤S308,数据库连接器将数据库操作语句的解释语句发送至数据库。
步骤S309,数据库执行数据库操作语句的解释语句并将解释语句的结果集返回至数据库连接器。如图4所示,为本发明实施例数据库返回解释语句的结果集的例子。
步骤S310,数据库连接器根据所述解释语句的结果集判断所述数据库操作语句是否使用了索引。如果已使用了索引,则也无需进行索引优化,按照已有流程处理即可。
具体地,可同时参见图4,本发明实施例可根据返回结果集的key,这一列的值判断是否使用了索引。其中,key列的值表示当前的SQL查询语句是否使用了索引。如果key列的值为空,则表示该SQL查询语句没有使用索引,因此表示该SQL查询语句需要进行SQL优化操作。如果key列的值不为空,则表示此SQL查询语句已经使用了索引,表示不需要进行索引优化,按照已有流程处理即可。
步骤S311,如果判断数据库操作语句未使用索引,则数据库连接器创建数据库索引创建语句,并将数据库创建语句发送至数据库以在数据库中增加相应的索引。在本发明的一个实施例中,首先数据库连接器对数据库操作语句进行解析以获得数据库操作语句之中的字段名称。接着,数据库连接器根据字段名称创建数据库索引创建语句。
具体地,如果发现当前的SQL语句没有使用索引时,则需要通过SQLparser来解析此条SQL语句,以获得该SQL语句条件中的字段名称。例如SQL查询语句为“select*fromstudentwherename=”,则通过SQLparser可以获得name字段名称。数据库连接器可根据获得的字段名称可以生成一条创建索引的语句。例如,数据库连接器可以以name字段名称为列,生成数据库索引创建语句,例如,CREATEINDEXstudent_nameONstudent(name)。接着,数据库连接器把该数据库索引创建语句发送给数据库,数据库可根据该数据库索引创建语句自动创建一个新的索引,以确保原来的数据库操作语句在发送相应请求到数据库之前,已经存在对应的索引,从而提升查询的效率。
如图5所示,为本发明实施例对数据库进行大数据集优化的方法示意图。该方法包括以下步骤:
步骤S501,虚拟机代理获得虚拟机装载前的类信息。在本发明的实施例中,虚拟机可为Java虚拟机。具体地,该类信息以字节码的形式存在。在本发明的一个实施例中,这些类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。其中,java.lang.ClassLoader是装载类的类,所有的类信息都通过java.lang.ClassLoader类装载到内存之中。本发明的实施例可适于JDBC相连的各种数据库,例如Mysql数据库、Informix数据库、Oracle数据库、Sybase数据库等。
步骤S502,虚拟机代理对类信息进行分析以确定类信息中的数据库驱动类信息。具体地,虚拟机代理对所有类信息进行分析,根据类信息的类名、包名等进行过滤,以在这些类信息之中确定数据库驱动类信息。
步骤S503,虚拟机代理在数据库驱动类信息之中织入第一代码及第一操作类代码,以及第二代码及第二操作类代码。其中,第一操作类代码为执行第一代码的指令的代码,第一代码用于在被执行时获取数据库驱动类信息中的数据库操作语句。第二操作类代码为执行第二代码的指令的代码,第二代码用于在被执行时获取数据库操作语句的结果集,且第二代码在数据库操作语句执行之后执行。在本发明的一个实施例中,依然以Mysql数据库为例,其中,第一操作类代码可为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码。在本发明的实施例中,第一操作类代码和第一代码应在数据库操作语句执行之前执行,通过第一操作类代码执行该第一代码。第二操作类代码为执行execute,仅更新executeUpdate,仅查询executeQuery中一种或多种的代码。
在本发明的实施例中,为了执行大数据集优化,还需要虚拟机代理在数据库驱动类信息之中织入第二代码及第二操作类代码,且第二代码在数据库操作语句执行之后执行。如图6所示,为本发明实施例织入第一操作类代码、第一代码及第二操作类代码和第二代码的示意图。
步骤S504,虚拟机将织入第一代码及第一操作类代码、第二代码及第二操作类代码的数据库驱动类信息进行装载,并通过虚拟机代理将装载后的数据库驱动类信息发送至数据库连接器。在本发明的实施例中,虚拟机可通过核心类java.lang.ClassLoader对织入第一代码及第一操作类代码、第二代码及第二操作类代码的数据库驱动类信息进行装载,将其装载至内存。
步骤S505,数据库连接器对装载后的数据库驱动类信息进行转换并发送至数据库,并通过第一操作类代码执行第一代码以获取数据库操作语句。数据库连接器在对数据库驱动类信息进行转换前,会先通过第一操作类代码执行第一代码以获取数据库操作语句。
步骤S506,数据库连接器在数据库执行数据库操作语句之后,通过第二操作类代码执行第二代码以获取数据库操作语句的结果集。在本发明的实施例中,数据库连接器在数据库对数据库操作语句执行之后,数据库连接器通过第二操作类代码执行第二代码以获得数据库执行数据库操作语句之后返回的结果集。例如,在SQL语句执行完成后,数据库会返回一个数据库的结果集ResultSetImpl对象。
步骤S507,对数据库操作语句的结果集进行分析以确定该结果集的字节数及记录行数。例如,在本发明的一个具体实施例中,针对ResultSetImpl对象,可以获得byteSize和rowDatalength两个属性,分别表示此次数据库操作语句返回的数据的字节大小和此次数据库操作语句返回的记录的行数。
步骤S508,如果结果集的字节数或记录行数超过预设值,则判断结果集为大数据集。作为本发明的一个实施例,当检测的byteSize或rowDataLength两个属性的值超过设置的限定值时,例如当行数据超过10000行时,则表示此次请求是一个大数据集的请求。
步骤S509,如果判断结果集为大数据集,则进一步判断结果集的发送方式是否为游标方式。当确定此次请求是一个大的数据集请求时,则对ResultSetImpl对象的rowData属性进行分析,如果rowData属性的类型不是RowDataCursor对象(游标方式),则表示此次请求的行为会一次性会把这10000行的数据一次性返回到客户端,那是非常占IO带宽的操作。
步骤S510,如果判断结果集的发送方式不为游标方式,则数据库连接器将所述结果集的发送方式设置为游标方式。本发明实施例的大数据集优化方式就是把请求的结果集rowData使用RowDataCursor对象来代替,即设置ResultSetImpl对象中的Connection属性(),调用setUseCursorFetch方法,设置参数值为true即可。
如图7a和7b所示,分别为大数据集优化前和优化后的操作示意图。如图所示,本发明实施例使用游标方式后,当查询结果10000行,不会一次性把所有的行返回到客户端,而是当用户调用rowData.next方法时,动态的从数据库取后续的几条来处理,这样针对大数据集的IO占满情况就可以被有效地缓解。
如图8所示,为本发明实施例数据库的优化***的结构图。该***包括虚拟机100、虚拟机代理200、数据库连接器300和数据库400。其中,虚拟机100用于根据用户的指令生成类信息,并由虚拟机代理200织入第一代码及第一操作类代码的数据库驱动类信息进行装载。在本发明的一个实施例中,这些类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。其中,java.lang.ClassLoader是装载类的类,所有的类信息都通过java.lang.ClassLoader类装载到内存之中。本发明的实施例可适于JDBC相连的各种数据库,例如Mysql数据库、Informix数据库、Oracle数据库、Sybase数据库等。
其中,虚拟机代理200用于获得虚拟机100装载前的类信息,并对该类信息进行分析以确定该类信息中的数据库驱动类信息,以及在数据库驱动类信息之中织入第一代码及第一操作类代码,并通过虚拟机代理200将虚拟机100装载后的数据库驱动类信息发送至数据库连接器300。其中,第一操作类代码为执行第一代码的指令的代码,第一代码用于在被执行时获取数据库驱动类信息中的数据库操作语句。数据库连接器300用于对装载后的数据库驱动类信息进行转换并发送至数据库,并通过第一操作类代码执行第一代码以获取数据库操作语句,以及根据数据库操作语句对数据库400进行优化。在本发明的实施例中,可对数据库进行索引优化或大数据集优化等。在以下的实施例中,将分别对索引优化及大数据集优化进行详细介绍。但本领域技术人员应当理解的是,索引优化及大数据集优化仅为本发明的优选实施例,本领域技术人员在获得数据库操作语句之后还可根据数据库操作语句,及以下索引优化及大数据集优化的思想完成其他对数据库的优化,这些也均应包含在本发明实施例的包含范围之内。
如图9所示,为本发明实施例的用于数据库索引优化的数据库连接器的结构图。数据库连接器300包括判断模块310、解释语句生成模块320、发送模块330、接收模块340和优化模块350。其中,判断模块310用于判断数据库操作语句是否为数据库查询语句。解释语句生成模块320用于在判断模块310判断数据库操作语句为数据库查询语句时,根据数据库操作语句生成数据库操作语句的解释语句。具体地,可首先通过数据库提供的explain命令,对SQL语句进行改写,例如,SQL语句为Select*fromstuentwherename=”;改写后的SQL语句的解释语句即为explainselect*fromstudentwherename=”。发送模块330用于将数据库操作语句的解释语句发送至数据库,以通过数据库执行数据库操作语句的解释语句。接收模块340用于从数据库400接收解释语句的结果集。优化模块350用于在数据库操作语句未使用索引时,创建数据库索引创建语句,并将数据库创建语句发送至数据库400以在数据库400中增加相应的索引。
在本发明的实施例中,进一步地,优化模块350包括解析子模块351和创建子模块352。解析子模块351用于对数据库操作语句进行解析以获得数据库操作语句之中的字段名称。创建子模块352用于根据该字段名称创建数据库索引创建语句。
如图10所示,为本发明实施例的用于数据库大数据集优化的数据库连接器的结构图。在该实施例中,虚拟机代理200还用于在数据库驱动类信息之中织入第二代码及第二操作类代码,其中,第二操作类代码为执行第二代码的指令的代码,第二代码用于在被执行时获取数据库操作语句的结果集,且第二代码在数据库操作语句执行之后执行。该数据库连接器300包括执行模块360、分析模块370、判断模块380和设置模块390。需要说明的是,这些模块可单独存在于数据库连接器300之中,也可在上述图9所示数据库连接器300的基础上存在,即数据库连接器300同时包含索引优化及大数据集优化两种功能。
其中,执行模块360用于在数据库400执行数据库操作语句之后,通过第二操作类代码执行第二代码以获取数据库操作语句的结果集。分析模块370用于对数据库操作语句的结果集进行分析以确定结果集的字节数及记录行数。判断模块380用于在结果集的字节数或记录行数超过预设值时,进一步判断结果集的发送方式是否为游标方式。设置模块390用于在结果集的发送方式不为游标方式时,将结果集的发送方式设置为游标方式。
在本发明的实施例中,虚拟机100为Java虚拟机,数据库连接器300为Java数据库连接器JDBC,且类信息为装载至Java虚拟机100的核心类java.lang.ClassLoader的类信息。在本发明的一个是实施例中,第一操作类代码为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码,且第二操作类代码为执行ezxecute,仅更新executeUpdate,仅查询executeQuery中一种或多种的代码。
如图11所示,为本发明实施例的数据库操作语句的获取方法流程图,该方法包括以下步骤:
步骤S1101,虚拟机代理(agent)获得虚拟机装载前的类信息。在本发明的实施例中,虚拟机可为Java虚拟机。在目前的Java虚拟机技术中,虚拟机代理提供一个功能,可以得到Java类装载前的类信息。具体地,该类信息以字节码的形式存在。在本发明的一个实施例中,这些类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。其中,java.lang.ClassLoader是装载类的类,所有的类信息都通过java.lang.ClassLoader类装载到内存之中。本发明正是采用虚拟机代理能够获得虚拟机通过java.lang.ClassLoader类装载之前的类信息这一特性,来实现本发明实施例代码的无缝动态织入。从而进一步实现在不修改JDBC连接驱动配置的基础上实现数据库操作语句的获取。
本发明的实施例可适于JDBC相连的各种数据库,例如Mysql数据库、Informix数据库、Oracle数据库、Sybase数据库等。在本发明的以下实施例中,将以Mysql数据库为例进行描述,但本领域技术人员应当理解的是,本发明实施例还可用于上述已知的或者今后发展的任何数据库,只要该数据库能够被JDBC支持即可。
步骤S1102,虚拟机代理对类信息进行分析以确定类信息中的数据库驱动类信息。具体地,虚拟机代理对所有类信息进行分析,根据类信息的类名、包名等进行过滤,以在这些类信息之中确定数据库驱动类信息。在本发明的实施例中,以Mysql数据库为例的话,可以找到Mysql驱动的特定类com.mysql.jdbc.Driver,从而识别Mysql驱动的加载。在本发明的其他实施例中,对于其他不同类型的数据库,也可选择其他数据库驱动的特定的类,在此不再一一赘述。
步骤S1103,虚拟机代理在数据库驱动类信息之中织入第一代码及第一操作类代码,其中,第一操作类代码为执行第一代码的指令的代码,第一代码用于在被执行时获取数据库驱动类信息中的数据库操作语句。在本发明的一个实施例中,依然以Mysql数据库为例,其中,第一操作类代码可为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码。如图2所示,为本发明实施例织入第一操作类代码及第一代码的示意图。在本发明的实施例中,第一操作类代码和第一代码应在数据库操作语句执行之前执行,通过第一操作类代码执行该第一代码。因此从图中可以看出,第一操作类代码和第一代码介于ClassStatementImpl和MethodStatementImpl之间,从而使得第一操作类代码和第一代码限于数据库操作语句而被数据库连接器所执行。
步骤S1104,虚拟机将织入第一代码及第一操作类代码的数据库驱动类信息进行装载,并通过虚拟机代理将装载后的数据库驱动类信息发送至数据库连接器。在本发明的实施例中,虚拟机可通过核心类java.lang.ClassLoader对织入第一代码及第一操作类代码的数据库驱动类信息进行装载,将其装载至内存。在本发明的实施例中,该数据库连接器可为Java数据库连接器,即JDBC。
步骤S1105,数据库连接器对装载后的数据库驱动类信息进行转换并发送至数据库,并通过第一操作类代码执行第一代码以获取数据库操作语句。数据库连接器在对数据库驱动类信息进行转换前,会先通过第一操作类代码执行第一代码以获取数据库操作语句。
在本发明的上述实施例中,通过上述虚拟机代理无缝地织入的第一代码及第一操作类代码,可以在无侵入的情况下对数据库操作语句(例如SQL语句)进行拦截,因此无需对JDBC的连接驱动配置进行修改,从而提高了数据库的安全性和稳定性。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行***、装置或设备(如基于计算机的***、包括处理器的***或其他可以从指令执行***、装置或设备取指令并执行指令的***)使用,或结合这些指令执行***、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行***、装置或设备或结合这些指令执行***、装置或设备而使用的装置。
计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行***执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。
Claims (31)
1.一种数据库的优化方法,其特征在于,包括以下步骤:
获得虚拟机装载前的类信息,并对所述类信息进行分析以确定所述类信息中的数据库驱动类信息;
在所述数据库驱动类信息之中织入第一代码及第一操作类代码;
数据库连接器根据织入的所述第一代码及所述第一操作类代码获取数据库操作语句;以及
根据所述数据库操作语句对所述数据库进行优化。
2.如权利要求1所述的数据库的优化方法,其特征在于,其中,所述第一操作类代码为执行所述第一代码的指令的代码,所述第一代码用于在被执行时获取所述数据库驱动类信息中的数据库操作语句。
3.如权利要求2所述的数据库的优化方法,其特征在于,所述根据织入的所述第一代码及所述第一操作类代码获取数据库操作语句进一步包括:
将织入所述第一代码及所述第一操作类代码的所述数据库驱动类信息进行装载;
对装载后的数据库驱动类信息进行转换,并通过所述第一操作类代码执行所述第一代码以获取所述数据库操作语句。
4.如权利要求1-3任一项所述的数据库的优化方法,其特征在于,所述对所述数据库进行优化为对所述数据库进行索引优化。
5.如权利要求4所述的数据库的优化方法,其特征在于,所述对所述数据库进行索引优化进一步包括:
判断所述数据库操作语句是否为数据库查询语句;
如果为所述数据库查询语句,则根据所述数据库操作语句生成所述数据库操作语句的解释语句;
将所述数据库操作语句的解释语句发送至所述数据库;
执行所述数据库操作语句的解释语句并将所述解释语句的结果集返回至所述数据库连接器;
根据所述解释语句的结果集判断所述数据库操作语句是否使用了索引;以及
如果判断所述数据库操作语句未使用所述索引,则创建数据库索引创建语句,并将所述数据库索引创建语句发送至所述数据库以在所述数据库中增加相应的索引。
6.如权利要求5所述的数据库的优化方法,其特征在于,创建数据库索引创建语句进一步包括:
对所述数据库操作语句进行解析以获得所述数据库操作语句之中的字段名称;以及
根据所述字段名称创建所述数据库索引创建语句。
7.如权利要求1-3任一项所述的数据库的优化方法,其特征在于,还包括:
在所述数据库驱动类信息之中织入第二代码及第二操作类代码,其中,所述第二操作类代码为执行所述第二代码的指令的代码,所述第二代码用于在被执行时获取所述数据库操作语句的结果集,且所述第二代码在所述数据库操作语句执行之后执行。
8.如权利要求7所述的数据库的优化方法,其特征在于,所述对所述数据库进行优化为对所述数据库进行大数据集优化。
9.如权利要求8所述的数据库的优化方法,其特征在于,所述对所述数据库进行大数据集优化进一步包括:
在所述数据库执行所述数据库操作语句之后,通过所述第二操作类代码执行所述第二代码以获取所述数据库操作语句的结果集;
对所述数据库操作语句的结果集进行分析以确定所述结果集的字节数及记录行数;
如果所述结果集的字节数或记录行数超过预设值,则判断所述结果集为大数据集,并进一步判断所述结果集的发送方式是否为游标方式;以及
如果判断所述结果集的发送方式不为游标方式,则将所述结果集的发送方式设置为游标方式。
10.如权利要求1所述的数据库的优化方法,其特征在于,所述虚拟机为Java虚拟机,所述数据库连接器为Java数据库连接器。
11.如权利要求10所述的数据库的优化方法,其特征在于,所述类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。
12.如权利要求9所述的数据库的优化方法,其特征在于,所述第一操作类代码为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码,所述第二操作类代码为执行execute,仅更新executeUpdate,仅查询executeQuery中一种或多种的代码。
13.一种数据库的优化***,其特征在于,包括虚拟机、虚拟机代理及数据库连接器,其中,
所述虚拟机,用于根据用户的指令生成类信息,并由所述虚拟机代理织入第一代码及第一操作类代码的数据库驱动类信息进行装载;
虚拟机代理,用于获得虚拟机装载前的类信息,并对所述类信息进行分析以确定所述类信息中的数据库驱动类信息,以及在所述数据库驱动类信息之中织入第一代码及第一操作类代码,并通过所述虚拟机代理将所述虚拟机装载后的所述数据库驱动类信息发送至数据库连接器;
所述数据库连接器,用于对所述装载后的所述数据库驱动类信息进行转换并发送至数据库,并根据织入的所述第一代码及所述第一操作类代码获取数据库操作语句,以及根据所述数据库操作语句对所述数据库进行优化。
14.如权利要求13所述的数据库的优化***,其特征在于,其中,所述第一操作类代码为执行所述第一代码的指令的代码,所述第一代码用于在被执行时获取所述数据库驱动类信息中的数据库操作语句。
15.如权利要求14所述的数据库的优化***,其特征在于,所述数据库连接器通过所述第一操作类代码执行所述第一代码以获取所述数据库操作语句。
16.如权利要求13-15任一项所述的数据库的优化***,其特征在于,所述数据库连接器对所述数据库进行索引优化。
17.如权利要求16所述的数据库的优化***,其特征在于,所述数据库连接器进一步包括:
判断模块,用于判断所述数据库操作语句是否为数据库查询语句;
解释语句生成模块,用于在所述判断模块判断所述数据库操作语句为所述数据库查询语句时,根据所述数据库操作语句生成所述数据库操作语句的解释语句;
发送模块,用于将所述数据库操作语句的解释语句发送至所述数据库,以通过所述数据库执行所述数据库操作语句的解释语句;
接收模块,用于从所述数据库接收所述解释语句的结果集;以及
优化模块,用于在所述数据库操作语句未使用索引时,创建数据库索引创建语句,并将所述数据库索引创建语句发送至所述数据库以在所述数据库中增加相应的索引。
18.如权利要求17所述的数据库的优化***,其特征在于,所述优化模块进一步包括:
解析子模块,用于对所述数据库操作语句进行解析以获得所述数据库操作语句之中的字段名称;以及
创建子模块,用于根据所述字段名称创建所述数据库索引创建语句。
19.如权利要求13-15任一项所述的数据库的优化***,其特征在于,所述虚拟机代理还用于在所述数据库驱动类信息之中织入第二代码及第二操作类代码,其中,所述第二操作类代码为执行所述第二代码的指令的代码,所述第二代码用于在被执行时获取所述数据库操作语句的结果集,且所述第二代码在所述数据库操作语句执行之后执行。
20.如权利要求19所述的数据库的优化***,其特征在于,所述数据库连接器对所述数据库进行大数据集优化。
21.如权利要求20所述的数据库的优化***,其特征在于,所述数据库连接器进一步包括:
执行模块,用于在所述数据库执行所述数据库操作语句之后,通过所述第二操作类代码执行所述第二代码以获取所述数据库操作语句的结果集;
分析模块,用于对所述数据库操作语句的结果集进行分析以确定所述结果集的字节数及记录行数;
判断模块,用于在所述结果集的字节数或记录行数超过预设值时,进一步判断所述结果集的发送方式是否为游标方式;以及
设置模块,用于在所述结果集的发送方式不为游标方式时,将所述结果集的发送方式设置为游标方式。
22.如权利要求13所述的数据库的优化***,其特征在于,所述虚拟机为Java虚拟机,所述数据库连接器为Java数据库连接器。
23.如权利要求22所述的数据库的优化***,其特征在于,所述类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。
24.如权利要求19所述的数据库的优化***,其特征在于,所述第一操作类代码为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码,所述第二操作类代码为执行execute,仅更新executeUpdate,仅查询executeQuery中一种或多种的代码。
25.一种数据库操作语句的获取方法,其特征在于,包括以下步骤:
获得虚拟机装载前的类信息;
对所述类信息进行分析以确定所述类信息中的数据库驱动类信息;
在所述数据库驱动类信息之中织入第一代码及第一操作类代码;
数据库连接器根据织入的所述第一代码及所述第一操作类代码获取数据库操作语句。
26.如权利要求25所述的数据库操作语句的获取方法,其特征在于,其中,所述第一操作类代码为执行所述第一代码的指令的代码,所述第一代码用于在被执行时获取所述数据库驱动类信息中的数据库操作语句。
27.如权利要求26所述的数据库操作语句的获取方法,其特征在于,所述根据织入的所述第一代码及所述第一操作类代码获取数据库操作语句进一步包括:
将织入所述第一代码及所述第一操作类代码的所述数据库驱动类信息进行装载;以及
对装载后的数据库驱动类信息进行转换并发送至数据库,并通过所述第一操作类代码执行所述第一代码以获取所述数据库操作语句。
28.如权利要求27所述的数据库操作语句的获取方法,其特征在于,还包括:
虚拟机代理在所述数据库驱动类信息之中织入第二代码及第二操作类代码,其中,所述第二操作类代码为执行所述第二代码的指令的代码,所述第二代码用于在被执行时获取所述数据库操作语句的结果集,且所述第二代码在所述数据库操作语句执行之后执行。
29.如权利要求25所述的数据库操作语句的获取方法,其特征在于,所述虚拟机为Java虚拟机,所述数据库连接器为Java数据库连接器。
30.如权利要求29所述的数据库操作语句的获取方法,其特征在于,所述类信息为装载至所述Java虚拟机的核心类java.lang.ClassLoader的类信息。
31.如权利要求28所述的数据库操作语句的获取方法,其特征在于,所述第一操作类代码为普通SQL语句执行描述对象StatementImpl,预处理SQL语句执行描述对象PreparedStatment和存储过程SQL语句执行描述对象CallableStatement中一种或多种的代码,所述第二操作类代码为执行execute,仅更新executeUpdate,仅查询executeQuery中一种或多种的代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110421548.XA CN103164455B (zh) | 2011-12-15 | 2011-12-15 | 数据库的优化方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110421548.XA CN103164455B (zh) | 2011-12-15 | 2011-12-15 | 数据库的优化方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103164455A CN103164455A (zh) | 2013-06-19 |
CN103164455B true CN103164455B (zh) | 2016-08-03 |
Family
ID=48587549
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110421548.XA Active CN103164455B (zh) | 2011-12-15 | 2011-12-15 | 数据库的优化方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103164455B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103440161B (zh) * | 2013-08-15 | 2017-03-29 | 北京京东尚科信息技术有限公司 | 一种Java虚拟机内部对象监控方法、装置和*** |
CN104714984A (zh) * | 2013-12-17 | 2015-06-17 | ***通信集团湖南有限公司 | 一种数据库优化的方法和装置 |
CN105320679B (zh) * | 2014-07-11 | 2019-05-24 | ***通信集团重庆有限公司 | 一种数据表索引集合生成方法及装置 |
CN106033422A (zh) * | 2015-03-11 | 2016-10-19 | ***通信集团内蒙古有限公司 | 一种数据库操作控制方法、装置及*** |
CN106528551A (zh) * | 2015-09-09 | 2017-03-22 | 北京国双科技有限公司 | 申请内存的方法和装置 |
CN109241076A (zh) * | 2018-08-01 | 2019-01-18 | 上海依图网络科技有限公司 | 一种数据查询方法及装置 |
CN110413641A (zh) * | 2019-07-15 | 2019-11-05 | 苏州浪潮智能科技有限公司 | 一种数据库卡顿处理方法与装置 |
CN111831659B (zh) * | 2020-07-09 | 2022-09-06 | 天津车之家数据信息技术有限公司 | 一种检查索引的方法、装置及计算设备 |
CN114547086B (zh) * | 2022-04-22 | 2022-07-22 | 网易(杭州)网络有限公司 | 数据处理方法、装置、设备及计算机可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1499366A (zh) * | 2002-11-08 | 2004-05-26 | 深圳市中兴通讯股份有限公司 | 数据库驱动程序的装载方法 |
CN101059810A (zh) * | 2007-03-16 | 2007-10-24 | 华为技术有限公司 | 一种实现数据库***自动优化的***和方法 |
CN101226497A (zh) * | 2007-12-10 | 2008-07-23 | 金蝶软件(中国)有限公司 | 应用程序监控***和监控方法 |
CN102110162A (zh) * | 2011-02-24 | 2011-06-29 | 北京中电普华信息技术有限公司 | 一种实现sql数据库监控的方法和装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6625617B2 (en) * | 1996-01-02 | 2003-09-23 | Timeline, Inc. | Modularized data retrieval method and apparatus with multiple source capability |
US7089562B1 (en) * | 2000-05-04 | 2006-08-08 | International Business Machines Corporation | Universal driver server |
US20050119999A1 (en) * | 2003-09-06 | 2005-06-02 | Oracle International Corporation | Automatic learning optimizer |
US8655853B2 (en) * | 2004-10-01 | 2014-02-18 | Sap Ag | System and method for optimizing database transaction termination |
CN101436209B (zh) * | 2008-12-15 | 2011-01-05 | 中兴通讯股份有限公司 | 一种多数据库同步的方法和装置 |
-
2011
- 2011-12-15 CN CN201110421548.XA patent/CN103164455B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1499366A (zh) * | 2002-11-08 | 2004-05-26 | 深圳市中兴通讯股份有限公司 | 数据库驱动程序的装载方法 |
CN101059810A (zh) * | 2007-03-16 | 2007-10-24 | 华为技术有限公司 | 一种实现数据库***自动优化的***和方法 |
CN101226497A (zh) * | 2007-12-10 | 2008-07-23 | 金蝶软件(中国)有限公司 | 应用程序监控***和监控方法 |
CN102110162A (zh) * | 2011-02-24 | 2011-06-29 | 北京中电普华信息技术有限公司 | 一种实现sql数据库监控的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN103164455A (zh) | 2013-06-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103164455B (zh) | 数据库的优化方法及装置 | |
KR101499599B1 (ko) | 그래프 기반 계산에서의 데이터 로깅 | |
CN102193922B (zh) | 一种对数据库进行访问的方法和装置 | |
US8065315B2 (en) | Solution search for software support | |
US7739269B2 (en) | Incremental repair of query plans | |
US8554599B2 (en) | Work item rules for a work item tracking system | |
CN112650766B (zh) | 数据库数据操作的方法、***及服务器 | |
US8321833B2 (en) | Compact syntax for data scripting language | |
US8539442B2 (en) | Reverse engineering for code file refactorization and conversion | |
US8874601B2 (en) | SADL query view—a model-driven approach to speed-up read-only use cases | |
JP5791149B2 (ja) | データベース・クエリ最適化のためのコンピュータで実装される方法、コンピュータ・プログラム、およびデータ処理システム | |
CN104765731A (zh) | 数据库查询优化方法和设备 | |
CN109885642B (zh) | 面向全文检索的分级存储方法及装置 | |
CN110941629A (zh) | 元数据处理方法、装置、设备及计算机可读存储介质 | |
KR101877828B1 (ko) | 인공지능 기반의 사용자 인터페이스 통합 플랫폼 시스템 | |
CN114090695A (zh) | 分布式数据库的查询优化的方法和装置 | |
US20170262507A1 (en) | Feedback mechanism for query execution | |
CN105468776A (zh) | 操作数据库的方法、装置及*** | |
CN116610697A (zh) | 数据库查询语句的查询方法、存储介质及设备 | |
CN112650563A (zh) | 业务处理方法、装置及电子设备 | |
CN110334098A (zh) | 一种基于脚本的数据库合并方法及*** | |
CN116756184B (zh) | 数据库实例处理方法、装置、设备、存储介质及程序产品 | |
US20220334829A1 (en) | Custom abap cloud enabler | |
Troelsen et al. | Exploring Entity Framework Core | |
CN118427218A (zh) | 状态信息配置方法及装置、电子设备、存储介质和计算机程序产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |