一种创建运行时数据源并自动切换的方法及系统技术方案

技术编号:34412140 阅读:17 留言:0更新日期:2022-08-03 22:04
本发明专利技术公开了一种创建运行时数据源并自动切换的方法及系统,其中创建运行时数据源并自动切换系统包括以下模块:运行时数据源注解、运行时数据源接口、动态数据源管理模块、运行时数据源切面模块、运行时数据源线程持有模块、运行时数据源缓存模块。本发明专利技术的创建运行时数据源并自动切换方法,开发者可以自由定义数据源信息存储来源,实现开发者无需关心运行时数据源该如何创建和切换。时数据源该如何创建和切换。时数据源该如何创建和切换。

【技术实现步骤摘要】
一种创建运行时数据源并自动切换的方法及系统


[0001]本专利技术属于数据处理
,尤其涉及一种创建运行时数据源并自动切换的方法及系统。

技术介绍

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

技术实现思路

[0006]针对上述技术问题,本专利技术公开一种创建运行时数据源并自动切换的方法及系统。
[0007]为达到上述目的,本专利技术采用的技术方案为:一种创建运行时数据源并自动切换的系统,包括以下模块:运行时数据源注解,标记“运行时数据源注解”的方法在执行期间使用动态创建的运行时数据源。
[0008]运行时数据源接口,当一个模块上实现了“运行时数据源接口”,则该模块具有运行时动态生成、切换和使用动态创建的运行时数据源的能力。运行时数据源接口定义了以
下方法:设置运行时动态数据源ID、获取运行时数据源JDBC URL地址、获取运行时数据源驱动名称、获取运行时数据源用户名、获取运行时数据源密码。
[0009]动态数据源管理模块,包括数据源ID和数据源对象的键值对映射属性、默认的数据源对象属性;还包括一个方法:获取当前线程应使用或正在使用的数据源ID。
[0010]运行时数据源切面模块,实现AOP动态代理功能。其作用是拦截标记了“运行时数据源注解”的方法。
[0011]运行时数据源线程持有模块,该模块持有当前线程正在操作的数据源ID。当目标方法需要操作数据库时,首先要通过该模块获取数据源ID。
[0012]进一步的,目标方法代理执行运行时数据源创建、注册逻辑包括:首先获取连接点信息,连接点包括目标方法的索引、所属对象、参数信息;从连接点信息中解析得到目标对象;判断目标对象是否实现了运行时数据源接口,以及目标方法是否标记了运行时数据源注解,如果同时满足条件,则认为该目标对象需要动态的创建运行时数据源,继续执行后续通知逻辑;否则认为该目标对象不需要创建运行时数据源,直接退出前置通知的执行;在执行创建前,程序会根据目标对象设置的数据库连接信息,先去运行时数据源缓存模块中查找数据源是否已存在,如果存在,则直接获取;如果不存在,则创建一个数据源对象;将创建好的数据源对象,注册到动态数据源管理模块的数据源ID和数据源对象的键值对映射属性中;调用运行时数据源线程持有模块,将创建的运行时数据源的数据源ID设置到当前线程中;当执行数据库操作前,动态数据源管理模块获取当前线程应使用的数据源ID,再从数据源ID和数据源对象的键值对映射属性中,根据数据源ID获取数据源对象,即实现数据源自动切换;运行时数据源的清理逻辑包括:首先获取连接点信息;从连接点信息中解析得到目标对象;判断目标对象是否实现了运行时数据源接口,如果未实现,则认为目标对象不需要清理运行时数据源信息,直接退出后置通知的执行;如果实现,则继续执行后续通知逻辑;从运行时数据源线程持有模块中获取当前线程使用的数据源ID,判断是否是系统默认数据源,如果是系统默认数据源,则不需要执行清理逻辑;如果不是默认数据源,则清理运行时数据源线程持有模块中存储的数据源ID;并判断是否需要清理运行时数据源信息;如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。
[0013]运行时数据源切面模块在运行时数据源注解的方法执行前织入动态创建运行时数据源,并实现线程数据源环境自动切换的逻辑;在方法执行后织入自动清理运行时数据源信息的逻辑,具体清理的信息包括数据源对象、数据库连接池缓存、运行时数据源线程持有模块。
[0014]进一步的,还包括运行时数据源缓存模块,能够缓存创建的运行时数据源对象,以
备后续使用。还包括数据源监测模块,判断是否需要清理运行时数据源信息;如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。
[0015]进一步的,数据源ID和数据源对象的键值对映射属性是一个Map数据类型,其key为数据源ID,value为数据源对象。
[0016]本专利技术还提供一种创建运行时数据源并自动切换的方法。自动切换指的是自动从当前默认数据源环境切换到新创建的运行时数据源环境。本方法采用了AOP(面向切面编程)思想,定义了运行时数据源切面模块。运行时数据源切面模块定义了前置通知和后置通知,其执行逻辑是:S11,运行时数据源切面模块根据声明的目标方法,寻找对应的连接点;目标方法指的是所在模块托管给spring容器管理、实现了运行时数据源接口、且标记了运行时数据源注解的方法。连接点是对当前运行的目标方法的抽象。
[0017]S12,运行时数据源切面模块根据寻找到的目标方法,将前置通知织入到目标方法执行前,将后置通知织入到目标方法执行后。前置通知主要为目标方法代理执行运行时数据源创建、注册等逻辑。后置通知主要做运行时数据源的清理等工作。
[0018]S13,当任意一个目标方法执行时,先执行事先织入的前置通知逻辑。
[0019]S14,目标方法开始执行具体的业务逻辑。
[0020]S15,目标方法执行完成。
[0021]S16,执行事先织入的后置通知逻辑。
[0022]本专利技术采用了运行时动态创建新数据源并自动切换的方式,实现开发者无需关心运行时数据源该如何创建和切换。
[0023]进一步的,S11的执行逻辑包本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种创建运行时数据源并自动切换的系统,其特征在于,包括以下模块:运行时数据源注解,标记运行时数据源注解的方法在执行期间使用动态创建的运行时数据源;运行时数据源接口,当一个模块上实现了运行时数据源接口,则具有运行时动态生成、切换和使用动态创建的运行时数据源的能力;运行时数据源接口定义了以下方法:设置运行时动态数据源ID、获取运行时数据源JDBC URL地址、获取运行时数据源驱动名称、获取运行时数据源用户名、获取运行时数据源密码;动态数据源管理模块,包括数据源ID和数据源对象的键值对映射属性、默认的数据源对象属性;还包括以下方法:获取当前线程应使用或正在使用的数据源ID;运行时数据源切面模块:根据声明的目标方法,寻找目标方法对应的连接点;目标方法指的是所在模块托管给spring容器管理、实现了运行时数据源接口、且标记了运行时数据源注解的方法;连接点是对当前运行的目标方法的抽象;将前置通知织入到目标方法执行前,前置通知包括目标方法代理执行运行时数据源创建、注册逻辑;将后置通知织入到目标方法执行后,后置通知包括运行时数据源的清理逻辑;运行时数据源线程持有模块,持有当前线程正在操作的数据源ID;运行时数据源缓存模块,能够缓存创建的运行时数据源对象。2.根据权利要求1所述的创建运行时数据源并自动切换的系统,其特征在于:目标方法代理执行运行时数据源创建、注册逻辑包括:首先获取连接点信息,连接点包括目标方法的索引、所属对象、参数信息;从连接点信息中解析得到目标对象;判断目标对象是否实现了运行时数据源接口,以及目标方法是否标记了运行时数据源注解,如果同时满足条件,则认为该目标对象需要动态的创建运行时数据源,继续执行后续通知逻辑;否则认为该目标对象不需要创建运行时数据源,直接退出前置通知的执行;在执行创建前,程序会根据目标对象设置的数据库连接信息,先去运行时数据源缓存模块中查找数据源是否已存在,如果存在,则直接获取;如果不存在,则创建一个数据源对象;将创建好的数据源对象,注册到动态数据源管理模块的数据源ID和数据源对象的键值对映射属性中;调用运行时数据源线程持有模块,将创建的运行时数据源ID设置到当前线程中;当执行数据库操作前,动态数据源管理模块获取当前线程应使用的数据源ID,再从数据源ID和数据源对象的键值对映射属性中,根据数据源ID获取数据源对象,即实现数据源自动切换;运行时数据源的清理逻辑包括:首先获取连接点信息;从连接点信息中解析得到目标对象;判断目标对象是否实现了运行时数据源接口,如果未实现,则认为目标对象不需要清理运行时数据源信息,直接退出后置通知的执行;如果实现,则继续执行后续通知逻辑;从运行时数据源线程持有模块中获取当前线程使用的数据源ID,判断是否是系统默认数据源,如果是系统默认数据源,则不需要执行清理逻辑;
如果不是默认数据源,则清理运行时数据源线程持有模块中存储的数据源ID;并判断是否需要清理运行时数据源信息;如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。3.根据权利要求1或2所述的创建运行时数据源并自动切换的系统,其特征在于,还包括:数据源监测模块,根据数据源的使用频率,判断是否需要清理创建的运行时数据源信息;如果需要,则将运行时数据源对象从动态数据源管理模块和运行时数据源缓存模块中移除。4.根据权利要求1所述的创建运行时数据源并自动切换的系统,其特征在于:数据源ID和数据源对象的键值对映射属性是一个Map数据类型,key为数据源ID,value为数据源对象。5.一种创建运行时数据源并自动切换的...

【专利技术属性】
技术研发人员:汪浩李郃郑华忠
申请(专利权)人:好享家舒适智能家居股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1