本技术实施例涉及软件,尤其涉及一种基于sql语法的软件部署方法、介质及电子设备。
背景技术:
1、目前java开源软件的数据存储方式仅支持mysql数据库系统,例如nacos作为一个基于java开源的动态服务发现、配置管理和服务管理软件,其配置存储部分依赖于mysql,且数据库表结构和操作都是基于mysql设计的,而在实际生产环境中,由于oracle数据库的性能、可靠性和可扩展性较佳,因此在处理大规模、高并发的企业级应用时,广泛存在使用oracle数据库存储java开源软件的需求。
2、针对上述问题,在java开源软件仅支持mysql数据库的情况下,由于mysql和oracle在sql语法上存在差异,如果需要使用oracle数据库对java开源软件进行存储,则需要对java开源软件进行定制开发,重写大部分sql代码,并重新编译软件,才可以部署到使用oracle数据库的环境中,导致每次java开源软件发布新版本时,都需要执行上述操作,才可以实现将java开源软件部署到使用oracle数据库的环境中,极大增加了开发和维护成本。
3、目前并无有效手段以解决上述问题。
技术实现思路
1、本技术实施例提供一种基于sql语法的软件部署方法、介质及电子设备,用于有效降低开发和维护成本。
2、为达到上述目的,本技术的实施例采用如下技术方案:
3、第一方面,提供了一种基于sql语法的软件部署方法,该方法包括:
4、创建类加载拦截器,并在所述类加载拦截器中注册一个类文件转换器;
5、通过所述类文件转换器确定当前加载的类是否为mysql驱动类;
6、在当前加载的类是所述mysql驱动类的情况下,通过所述类加载拦截器拦截所述mysql驱动类,并加载目标驱动类,其中,所述目标驱动类是基于oracle驱动扩展的;
7、在oracle数据库驱动类的静态代码块中,将所述oracle数据库驱动类注册到jdbc驱动管理器中,并覆写所述oracle数据库的连接实例,所述连接实例用于实现与所述oracle数据库的连接,oracle数据库驱动类继承自oracle驱动类,所述oracle数据库是通过所述oracle驱动创建的;
8、对所述oracle数据库的连接实例进行包装,以将mysql的sql语法转换为oracle的sql语法。
9、在第一方面的一种可能的实现方式中,所述覆写所述oracle数据库的连接实例,包括:
10、在所述目标驱动类中重写connect方法;
11、调用父类的connect方法,以获取所述oracle数据库的连接实例;
12、创建连接装饰类,并通过所述连接装饰类对所述oracle数据库的连接实例进行封装,并返回所述连接装饰类。
13、在第一方面的另一种可能的实现方式中,所述对所述oracle数据库的连接实例进行包装,包括:
14、采用所述连接装饰类装饰createstatement方法,并创建statementwrapper;以及
15、采用所述连接装饰类装饰preparedstatement方法,并创建preparedstatementwrapper,调用sql转换工具类进行sql语法转换,以将所述preparedstatement创建的sql语法转换为所述oracle数据库的第一sql语法,其中,所述createstatement方法和所述preparedstatement方法用于创建sql语法,以在mysql数据库上执行sql查询;
16、通过所述statementwrapper拦截非预编译sql语法的执行,并调用所述sql转换工具类进行sql语法转换,以将所述非预编译sql语法转换为所述oracle数据库的第二sql语法;
17、通过所述preparedstatementwrapper拦截预编译sql语法的执行,并覆写getgeneratedkeys方法,所述getgeneratedkeys方法用于在执行所述mysql数据库的插入操作后获取由所述mysql数据库自动生成的键值;
18、确定所述第一sql语法与所述第二sql语法是否存在固定映射关系;
19、在存在所述固定映射关系的情况下,根据所述固定映射关系,返回与所述第一sql语法固定映射的第一目标sql语法,以及与所述第二sql语法固定映射的第二目标sql语法。
20、在第一方面的另一种可能的实现方式中,所述方法还包括:
21、在所述第一sql语法与所述第二sql语法不存在所述固定映射关系的情况下,对所述第一sql语法与所述第二sql语法进行语法解析,得到sql语法树;
22、根据所述sql语法树确定特殊语法并执行sql转换步骤,以将mysql的sql语法转换为oracle的sql语法。
23、在第一方面的另一种可能的实现方式中,所述sql转换步骤包括:
24、确定所述mysql的sql语法是否为不带表名语法,并在所述mysql的sql语法为不带表名语法的情况下,设置所述mysql的sql语法的表名为dual;
25、确定所述mysql的sql语法是否使用as别名,并在所述mysql的sql语法使用所述as别名的情况下,删除所述as别名;
26、确定所述mysql的sql语法是否包含反引号,并在所述mysql的sql语法包含所述反引号的情况下,删除所述反引号;
27、确定所述mysql的sql语法的非等表达式中是否使用禁止符号,并在所述mysql的sql语法的非等表达式中使用所述禁止符号的情况下,将所述禁止符号替换为对应语法;
28、对所述mysql的数据库函数进行函数转换,以将对应于所述mysql数据库的函数转换为对应于所述oracle数据库的函数;
29、确定所述mysql的sql语法是否为非预编译分页语句,并在所述mysql的sql语法为非预编译分页语句的情况下,进行分页转换。
30、在第一方面的另一种可能的实现方式中,所述方法还包括:
31、在所述sql转换工具类中引入缓存机制;
32、调用所述sql转换工具类进行sql语法转换,得到转换结果;
33、通过所述缓存机制,将所述转换结果缓存至redis中。
34、在第一方面的另一种可能的实现方式中,在所述调用所述sql转换工具类进行sql语法转换,得到转换结果之前,包括:
35、为每个所述mysql的sql语法生成一个唯一的缓存键,一个或多个缓存键用于表征一个历史转换结果;
36、所述方法还包括:
37、在所述redis中确定是否存在一个或多个缓存键与所述preparedstatement创建的sql语法命中;
38、在存在一个或多个缓存键与所述preparedstatement创建的sql语法命中的情况下,将与所述preparedstatement创建的sql语法命中的一个或多个缓存键作为目标缓存键,并获取所述目标缓存键对应的历史转换结果,所述历史转换结果用于表征通过调用所述sql转换工具类进行sql语法转换得到的所述转换结果。
39、在第一方面的另一种可能的实现方式中,所述方法还包括:
40、在当前加载的类是所述mysql驱动类的情况下,返回所述目标驱动类的字节码和字节数组;
41、在当前加载的类不是所述mysql驱动类的情况下,返回空字节数组。
42、第二方面,本技术提供一种机器可读存储介质,该机器可读存储介质上存储有指令,该指令用于使得机器执行上述的基于sql语法的软件部署方法。
43、第三方面,本技术提供一种电子设备,包括:
44、上述的机器可读存储介质;
45、处理器,被配置成从所述机器可读存储介质中调用指令以及在执行所述指令时能够实现根据上述的基于sql语法的软件部署方法。
46、通过上述技术方案,通过创建类加载拦截器,并在类加载拦截器中注册一个类文件转换器,确定当前加载的类是否为mysql驱动类,可以在java开源软件运行时动态检测和处理mysql驱动类;当检测到当前加载的类是mysql驱动类时,通过类加载拦截器拦截该类,并加载基于oracle驱动扩展的目标驱动类,从而可以在不修改java开源软件源代码的情况下,动态替换mysql驱动为oracle驱动;在oracle数据库驱动类的静态代码块中,将该类注册到jdbc驱动管理器中,并覆写连接实例,可以确保java开源软件在运行时使用oracle数据库驱动类进行数据库连接;对oracle数据库的连接实例进行包装,以将mysql的sql语法转换为oracle的sql语法,可以解决mysql和oracle在sql语法上的差异问题。综上,通过动态拦截和转换,避免了对java开源软件进行定制开发和重写sql代码的需求,除此之外,无需每次软件发布新版本时都重新编译和修改代码,极大地降低了开发和维护成本,并可以使java开源软件灵活地部署到使用oracle数据库的环境中,而无需修改软件本身,有效提高了部署灵活性。
47、本技术实施例的其它特征和优点将在随后的具体实施方式部分予以详细说明。
1.一种基于sql语法的软件部署方法,其特征在于,包括:
2.根据权利要求1所述的方法,其特征在于,所述覆写所述oracle数据库的连接实例,包括:
3.根据权利要求2所述的方法,其特征在于,所述对所述oracle数据库的连接实例进行包装,包括:
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
5.根据权利要求4所述的方法,其特征在于,所述sql转换步骤包括:
6.根据权利要求3所述的方法,其特征在于,所述方法还包括:
7.根据权利要求6所述的方法,其特征在于,在所述调用所述sql转换工具类进行sql语法转换,得到转换结果之前,包括:
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
9.一种机器可读存储介质,其特征在于,该机器可读存储介质上存储有指令,该指令用于使得机器执行根据权利要求1至8中任一项所述的基于sql语法的软件部署方法。
10.一种电子设备,其特征在于,包括: