一种创建运行时数据源并自动切换的方法及系统与流程

文档序号:30991958发布日期:2022-08-03 02:28阅读:130来源:国知局
一种创建运行时数据源并自动切换的方法及系统与流程

1.本发明属于数据处理技术领域,尤其涉及一种创建运行时数据源并自动切换的方法及系统。


背景技术:

2.当今互联网应用时代,后端服务一般对数据源的管理采取“一对一”的连接方式,即一个应用服务连接一个数据库,每个应用对应着单个数据源。然而随着业务的发展、数据量的暴增、对接系统的增多,“一对一”的方式很多时候已经难以满足应用需求。很多时候,应用服务需要支持同时连接多个数据库,即对应多个数据源,实现可以方便的查询各个数据库的数据,而不必通过tcp、http或webservice接口的方式跨服务调用来获取数据。
3.现如今,大多数系统对多数据源接入的方式采用声明式配置、用时即取、不用闲置的方式。声明式配置,指的是后端服务在运行前需配置好各个数据库的连接参数(例如数据库url地址、用户名、密码等)。用时即取,指的是服务运行后,会提前创建好各个数据源的数据库连接池缓存,连接池缓存里存放了若干个数据库连接对象。当客户端需要与数据库交互时,无需临时创建连接对象,只需从连接池缓存中获取、使用。不用闲置,指的是即使没有客户端使用这些数据源对象、数据库连接池对象缓存,这些对象在整个应用服务的运行生命周期也是长期存在的。只要服务不关闭,这些对象便不会消失。
4.多数据源采用声明式配置的方式,对于后续的代码开发固然带来了许多便利, 然而仍然存在如下缺点:应用服务需要提前配置好各个数据库的连接参数,这便要求开发者需要在开发阶段便知晓各个数据库的连接配置。假设某些数据库的连接信息在开发阶段无法确定,又或者连接数据库的数量有可能后期增加,开发者无法提前预知,也无法以硬编码的方式提前配置好。
5.依赖多个数据源的应用服务,大部分数据源的使用频率很低。现有技术需要在启动时即创建全部数据源,这将导致大量数据源对象和数据库连接池多数时间处于闲置状态,造成资源浪费。


技术实现要素:

6.针对上述技术问题,本发明公开一种创建运行时数据源并自动切换的方法及系统。
7.为达到上述目的,本发明采用的技术方案为:一种创建运行时数据源并自动切换的系统,包括以下模块:运行时数据源注解,标记“运行时数据源注解”的方法在执行期间使用动态创建的运行时数据源。
8.运行时数据源接口,当一个模块上实现了“运行时数据源接口”,则该模块具有运行时动态生成、切换和使用动态创建的运行时数据源的能力。运行时数据源接口定义了以
下方法:设置运行时动态数据源id、获取运行时数据源jdbc url地址、获取运行时数据源驱动名称、获取运行时数据源用户名、获取运行时数据源密码。
9.动态数据源管理模块,包括数据源id和数据源对象的键值对映射属性、默认的数据源对象属性;还包括一个方法:获取当前线程应使用或正在使用的数据源id。
10.运行时数据源切面模块,实现aop动态代理功能。其作用是拦截标记了“运行时数据源注解”的方法。
11.运行时数据源线程持有模块,该模块持有当前线程正在操作的数据源id。当目标方法需要操作数据库时,首先要通过该模块获取数据源id。
12.进一步的,目标方法代理执行运行时数据源创建、注册逻辑包括:首先获取连接点信息,连接点包括目标方法的索引、所属对象、参数信息;从连接点信息中解析得到目标对象;判断目标对象是否实现了运行时数据源接口,以及目标方法是否标记了运行时数据源注解,如果同时满足条件,则认为该目标对象需要动态的创建运行时数据源,继续执行后续通知逻辑;否则认为该目标对象不需要创建运行时数据源,直接退出前置通知的执行;在执行创建前,程序会根据目标对象设置的数据库连接信息,先去运行时数据源缓存模块中查找数据源是否已存在,如果存在,则直接获取;如果不存在,则创建一个数据源对象;将创建好的数据源对象,注册到动态数据源管理模块的数据源id和数据源对象的键值对映射属性中;调用运行时数据源线程持有模块,将创建的运行时数据源的数据源id设置到当前线程中;当执行数据库操作前,动态数据源管理模块获取当前线程应使用的数据源id,再从数据源id和数据源对象的键值对映射属性中,根据数据源id获取数据源对象,即实现数据源自动切换;运行时数据源的清理逻辑包括:首先获取连接点信息;从连接点信息中解析得到目标对象;判断目标对象是否实现了运行时数据源接口,如果未实现,则认为目标对象不需要清理运行时数据源信息,直接退出后置通知的执行;如果实现,则继续执行后续通知逻辑;从运行时数据源线程持有模块中获取当前线程使用的数据源id,判断是否是系统默认数据源,如果是系统默认数据源,则不需要执行清理逻辑;如果不是默认数据源,则清理运行时数据源线程持有模块中存储的数据源id;并判断是否需要清理运行时数据源信息;如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。
13.运行时数据源切面模块在运行时数据源注解的方法执行前织入动态创建运行时数据源,并实现线程数据源环境自动切换的逻辑;在方法执行后织入自动清理运行时数据源信息的逻辑,具体清理的信息包括数据源对象、数据库连接池缓存、运行时数据源线程持有模块。
14.进一步的,还包括运行时数据源缓存模块,能够缓存创建的运行时数据源对象,以
备后续使用。还包括数据源监测模块,判断是否需要清理运行时数据源信息;如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。
15.进一步的,数据源id和数据源对象的键值对映射属性是一个map数据类型,其key为数据源id,value为数据源对象。
16.本发明还提供一种创建运行时数据源并自动切换的方法。自动切换指的是自动从当前默认数据源环境切换到新创建的运行时数据源环境。本方法采用了aop(面向切面编程)思想,定义了运行时数据源切面模块。运行时数据源切面模块定义了前置通知和后置通知,其执行逻辑是:s11,运行时数据源切面模块根据声明的目标方法,寻找对应的连接点;目标方法指的是所在模块托管给spring容器管理、实现了运行时数据源接口、且标记了运行时数据源注解的方法。连接点是对当前运行的目标方法的抽象。
17.s12,运行时数据源切面模块根据寻找到的目标方法,将前置通知织入到目标方法执行前,将后置通知织入到目标方法执行后。前置通知主要为目标方法代理执行运行时数据源创建、注册等逻辑。后置通知主要做运行时数据源的清理等工作。
18.s13,当任意一个目标方法执行时,先执行事先织入的前置通知逻辑。
19.s14,目标方法开始执行具体的业务逻辑。
20.s15,目标方法执行完成。
21.s16,执行事先织入的后置通知逻辑。
22.本发明采用了运行时动态创建新数据源并自动切换的方式,实现开发者无需关心运行时数据源该如何创建和切换。
23.进一步的,s11的执行逻辑包括:s111,所有的目标方法执行前,都会先执行前置通知。前置通知首先获取连接点信息。连接点包括了目标方法的索引、所属对象、参数信息等。
24.s112,从连接点信息中解析得到目标对象;s113,判断目标对象是否实现了运行时数据源接口,以及目标方法是否标记了运行时数据源注解,如果同时满足条件,则认为该目标对象需要动态的创建运行时数据源,继续执行后续通知逻辑;否则认为该目标对象不需要创建运行时数据源,直接退出前置通知的执行;s114,在执行创建前,程序会根据目标对象设置的数据库连接信息,先去运行时数据源缓存模块中查找该数据源是否已存在,如果存在,则直接从缓存中获取。如果不存在,则创建一个数据源对象。本方式能够实现不需要开发者提前配置目标对象获取的用户名、密码等数据库连接信息,并可以对数据库连接信息随时更换。
25.s115,将创建好的新数据源对象,注册到动态数据源管理模块的数据源id和数据源对象的键值对映射属性中。该步骤表示当前spring容器中加入了一个新的数据源对象,同时交付给动态数据源管理模块进行管理,后续需要使用该数据源对象时,也由动态数据源管理模块提供获取的方法。
26.s116,数据源自动切换。调用运行时数据源线程持有模块,将创建的运行时数据源的数据源id设置到当前线程中。这样可以使当前线程后续执行过程中可以从程序的任意位置获取到当前正在使用的数据源id。当程序执行数据库操作前,动态数据源管理模块获取
当前线程应使用的数据源id,再从数据源id和数据源对象的键值对映射属性中,根据数据源id获取数据源对象,即实现数据源自动切换。
27.进一步的,上述方法还包括调用数据源监测模块,根据该数据源的使用频率,决定是否需要缓存s115创建的运行时数据源对象到运行时数据源缓存模块,以便后续当再次需要使用该数据源时,无需再次执行数据源创建过程,直接从缓存模块中获取。以及决定是否需要清理数据源以节省内存。
28.进一步的,s13的执行逻辑如下:该过程实现了运行期间动态的创建新数据源。
29.s131,目标方法实现了运行时数据源接口,调用目标对象的获取运行时数据源jdbc url方法。该方法不需要在程序运行之前就要设置好jdbc url,而是在运行期间通过该方法动态的获取。举例,可以实现将jdbc url配置在远程服务器的某个文件上,并且有可能随时改动。我们可以通过实现获取jdbc url方法,编写从远程服务器获取jdbc url的逻辑。这种做法能够实现将jdbc url配置在远程服务器上解决了数据库连接信息在开发阶段无法确定、后期可能频繁修改带来的问题,实现了动态的获取。
30.s132,调用目标对象的获取用户名的方法;s133,调用目标对象的获取密码的方法;s134,调用目标对象的获取数据库驱动的方法;s135,通过动态的获取到的jdbc url、用户名、密码、驱动,生成一个数据源对象。
31.s132
‑ꢀ
s134步骤与s131的逻辑和作用类似。
32.进一步的,s16的执行逻辑如下:s16的主要目的是在目标方法执行结束后,清理刚才创建的运行时数据源以节约内存。
33.s161,目标方法执行结束后,执行后置通知。后置通知首先获取连接点信息。
34.s162,从连接点信息中解析得到目标对象;s163,判断目标对象是否实现了运行时数据源接口,如果未实现,则认为该目标对象不需要清理运行时数据源信息,直接退出后置通知的执行;如果实现,则继续执行后续通知逻辑;s164,从运行时数据源线程持有模块中获取当前线程使用的数据源id,判断是否是系统默认数据源(系统默认数据源的数据源id为“master”,运行时数据源的数据源id则通过长整数标识),如果是系统默认数据源,则不需要执行清理逻辑;s165,如果不是默认数据源,则清理运行时数据源线程持有模块中存储的数据源id,防止内存泄露。同时判断是否需要清理运行时数据源信息。如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。
35.本发明具有以下有益效果:本发明的创建运行时数据源并自动切换的方法通过提供抽象接口,并定义了getdatasourceid(获取数据源id)、getjdbcurl(获取数据库url)、getdriverclassname(获取连接驱动)、getusername(获取数据库用户名)、getpassword(获取数据库密码)方法,开发者能够通过实现上述提供的抽象接口,并实现上述5个方法,自由定义应该如何获取数据源连接信息。因此使用本发明的方法,开发者可以自由定义数据源信息存储来源,可以从
ftp服务器获取,可以从某个配置文件中获取,可以从网络中获取等,方式更加灵活、多样化。本发明的方法不强制依赖第三方工具。
36.另外,本发明的方法无需前端请求。程序运行的任意期间都可以自由切换到任意数据源,也就是说,后台的方法链路中,可以在程序执行的任意位置,自由、灵活的创建和使用多个数据源。
37.例如,前端有个获取某订单信息的请求,这个订单信息里面还包含了商品信息、优惠券信息、用户信息、积分信息等。这些信息分别存储在订单数据源、商品数据源、优惠券数据源、用户数据源、积分数据源。通过本发明的方法,可以在程序执行到某个点的时候,切换到订单数据源,查询订单信息;程序又执行到某个点的时候,切换到商品数据源,查询商品信息;程序再执行到某个点的时候,切换到优惠券数据源,查询优惠券信息等。
38.最后,本发明基于aop思想,在目标方法执行前织入自动创建运行时数据源并自动切换的逻辑,实现了程序在运行期间根据开发者配置的获取数据源连接信息逻辑,动态的创建运行时数据源并自动切换和使用的功能,解决了数据源参数无法提前预知、无法提前配置好等问题。
附图说明
39.图1为本发明实施例的创建运行时数据源并自动切换和清理的总体流程图。
40.图2为本发明实施例的目标方法执行前创建运行时数据源并自动切换的方法流程图。
41.图3为本发明实施例的数据源自动切换流程图。
42.图4为本发明实施例的运行期间动态的创建新数据源的流程图。
43.图5为本发明实施例的清理创建的运行时数据源流程图。
具体实施方式
44.为了便于本领域技术人员的理解,下面结合实施例与附图对本发明作进一步的说明。
45.实施例1:本实施例的一种创建运行时数据源并自动切换的系统,包括以下模块:运行时数据源注解,标记“运行时数据源注解”的方法在执行期间使用动态创建的运行时数据源。
46.运行时数据源接口,当一个模块上实现了“运行时数据源接口”,则该模块具有运行时动态生成、切换和使用新数据源的能力。运行时数据源接口定义了以下方法:设置数据源id、获取运行时数据源jdbc url地址、获取运行时数据源驱动名称、获取运行时数据源用户名、获取运行时数据源密码。
47.动态数据源管理模块,包括数据源id和数据源对象的键值对映射属性、默认的数据源对象属性;还包括一个方法:获取当前线程应使用或正在使用的数据源id。数据源id和数据源对象的键值对映射属性是一个map数据类型,其key为数据源id,value为数据源对象。
48.运行时数据源切面模块,实现aop动态代理功能。其作用是拦截标记了“运行时数据源注解”的方法。运行时数据源切面模块在运行时数据源注解的方法执行前织入动态创
建运行时数据源,并实现线程数据源环境自动切换的逻辑;在方法执行后织入自动清理运行时数据源信息的逻辑,具体清理的信息包括数据源对象、数据库连接池缓存、运行时数据源线程持有模块。
49.运行时数据源线程持有模块,该模块持有当前线程正在操作的数据源id。当目标方法需要操作数据库时,首先要通过该模块获取数据源id。
50.运行时数据源缓存模块,能够缓存创建的运行时数据源对象,以备后续使用。
51.实施例2:一种创建运行时数据源并自动切换的方法。自动切换指的是自动从当前默认数据源环境切换到新创建的运行时数据源环境。本方法采用了aop(面向切面编程)思想,定义了运行时数据源切面模块。运行时数据源切面模块定义了前置通知和后置通知,其执行逻辑如图1所示:s11,运行时数据源切面模块根据声明的目标方法,寻找对应的连接点;目标方法指的是所在模块托管给spring容器管理、实现了运行时数据源接口、且标记了运行时数据源注解的方法。连接点是对当前运行的目标方法的抽象。
52.如图2所示,s11的执行逻辑包括:s111,所有的目标方法执行前,都会先执行前置通知。前置通知首先获取连接点信息。连接点包括了目标方法的索引、所属对象、参数信息等。
53.s112,从连接点信息中解析得到目标对象;s113,判断目标对象是否实现了运行时数据源接口,以及目标方法是否标记了运行时数据源注解,如果同时满足条件,则认为该目标对象需要动态的创建运行时数据源,继续执行后续通知逻辑;否则认为该目标对象不需要创建运行时数据源,直接退出前置通知的执行;s114,在执行创建前,程序会根据目标对象设置的数据库连接信息,先去运行时数据源缓存模块中查找该数据源是否已存在,如果存在,则直接从缓存中获取。如果不存在,则创建一个数据源对象。本方式能够实现不需要开发者提前配置目标对象获取的用户名、密码等数据库连接信息,并可以对数据库连接信息随时更换。
54.s115,将创建好的新数据源对象,注册到动态数据源管理模块的数据源id和数据源对象的键值对映射属性中。该步骤表示当前spring容器中加入了一个新的数据源对象,同时交付给动态数据源管理模块进行管理,后续需要使用该数据源对象时,也由动态数据源管理模块提供获取的方法。调用数据源监测模块,根据该数据源的使用频率,决定是否需要缓存创建的运行时数据源对象到运行时数据源缓存模块,以便后续当再次需要使用该数据源时,无需再次执行数据源创建过程,直接从运行时数据源缓存模块中获取。以及决定是否需要清理数据源以节省内存。
55.s116,数据源自动切换,如图3所示。调用运行时数据源线程持有模块,将创建的运行时数据源的数据源id设置到当前线程中。这样可以使当前线程后续执行过程中可以从程序的任意位置获取到当前正在使用的数据源id。当程序执行数据库操作前,动态数据源管理模块获取当前线程应使用的数据源id,再从数据源id和数据源对象的键值对映射属性中,根据数据源id获取数据源对象,即实现数据源自动切换。
56.s12,运行时数据源切面模块根据寻找到的目标方法,将前置通知织入到目标方法执行前,将后置通知织入到目标方法执行后。前置通知主要为目标方法代理执行运行时数
据源创建、注册等逻辑。后置通知主要做运行时数据源的清理等工作。
57.s13,当任意一个目标方法执行时,先执行事先织入的前置通知逻辑。
58.s13实现了运行期间动态的创建新数据源,如图4所示,执行逻辑如下:s131,目标方法实现了运行时数据源接口,调用目标对象的获取运行时数据源jdbc url方法。该方法不需要在程序运行之前就要设置好jdbc url,而是在运行期间通过该方法动态的获取。举例,可以实现将jdbc url配置在远程服务器的某个文件上,并且有可能随时改动。我们可以通过实现获取jdbc url方法,编写从远程服务器获取jdbc url的逻辑。这种做法能够实现将jdbc url配置在远程服务器上解决了数据库连接信息在开发阶段无法确定、后期可能频繁修改带来的问题,实现了动态的获取。
59.s132,调用目标对象的获取用户名的方法;s133,调用目标对象的获取密码的方法;s134,调用目标对象的获取数据库驱动的方法;s135,通过动态的获取到的jdbc url、用户名、密码、驱动,生成一个数据源对象。
60.s132
‑ꢀ
s134步骤与s131的逻辑和作用类似。
61.s14,目标方法开始执行具体的业务逻辑。
62.s15,目标方法执行完成。
63.s16,执行事先织入的后置通知逻辑。
64.如图5所示,s16的执行逻辑如下:s16的主要目的是在目标方法执行结束后,清理刚才创建的运行时数据源以节约内存。
65.s161,目标方法执行结束后,执行后置通知。后置通知首先获取连接点信息。
66.s162,从连接点信息中解析得到目标对象;s163,判断目标对象是否实现了运行时数据源接口,如果未实现,则认为该目标对象不需要清理运行时数据源信息,直接退出后置通知的执行;如果实现,则继续执行后续通知逻辑;s164,从运行时数据源线程持有模块中获取当前线程使用的数据源id,判断是否是系统默认数据源(系统默认数据源的数据源id为“master”,运行时数据源的数据源id则通过长整数标识),如果是系统默认数据源,则不需要执行清理逻辑;s165,如果不是默认数据源,则清理运行时数据源线程持有模块中存储的数据源id,防止内存泄露。同时程序还会调用数据源监测模块,判断是否需要清理运行时数据源信息。如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。
67.本实施例采用了运行时动态创建新数据源并自动切换的方式,实现开发者无需关心运行时数据源该如何创建和切换。本实施例的方法通过提供抽象接口,并定义了getdatasourceid(获取数据源id)、getjdbcurl(获取数据库url)、getdriverclassname(获取连接驱动)、getusername(获取数据库用户名)、getpassword(获取数据库密码)方法,开发者能够通过实现上述提供的抽象接口,并实现上述5个方法,自由定义应该如何获取数据源连接信息。因此使用本实施例的方法,开发者可以自由定义数据源信息存储来源,可以从ftp服务器获取,可以从某个配置文件中获取,可以从网络中获取等,方式更加灵活、多样
化。本实施例的方法不强制依赖第三方工具。
68.另外,本实施例的方法无需前端请求。程序运行的任意期间都可以自由切换到任意数据源,也就是说,后台的方法链路中,可以在程序执行的任意位置,自由、灵活的创建和使用多个数据源。
69.例如,前端有个获取某订单信息的请求,这个订单信息里面还包含了商品信息、优惠券信息、用户信息、积分信息等。这些信息分别存储在订单数据源、商品数据源、优惠券数据源、用户数据源、积分数据源。通过本发明的方法,可以在程序执行到某个点的时候,切换到订单数据源,查询订单信息; 程序又执行到某个点的时候,切换到商品数据源,查询商品信息;程序再执行到某个点的时候,切换到优惠券数据源,查询优惠券信息等。
70.以上的实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1