发明内容
本发明针对现有技术的不足,提供了一种多数据源动态隔离访问方法,利用动态数据库连接、访问与多事务处理技术,实现多数据源动态隔离访问,可根据软件系统的需要动态扩展数据源。
本发明采用的技术方案是:一种多数据源动态隔离访问方法,包括以下步骤:
第一步:生成多数据源动态连接;
第二步:生成多数据源动态查询;
第三步:将多数据源进行隔离存储。
作为优选:第一步包括以下步骤:
1)根据数据库和软件系统需要选择合适的数据库连接组件C,并记录唯一标识该连接的ID号、代表该连接的字符串CS和组件对象CO,其中,CO中包括一个以CS为参数的构造函数,并封装了对所连接数据库的操作方法,包括连接的创建与销毁;
2)在内存中申请一段空间M,包括三个组成部分,分别存储ID、CS和CO,该段空间以连续方式存储,以ID为索引,可根据ID迅速找到对应的数 据库C;
3)为C创建数据库连接池;
4)将该连接组件加入到M中:
5)当需要动态连接数据库时,需要事先给定连接组件ID。
作为优选:第二步包括以下步骤:
1)建立Hibernate环境,初始化Hibernate必要参数,使之正常运行,运行成功后,生成基本配置信息;
2)将第一步得到的数据库连接C注入基本配置信息,生成与该连接组件唯一对应的配置信息,并由配置信息生成ORM工厂,ORM工厂将自动完成ORM转换,将数据源转化为数据对象X,并生成包含对X进行操作的会话;
3)遍历第一步生成的M,获取所有数据连接C,重复上一步,得到全部会话队列,由于会话与C的唯一对应关系,可根据C唯一匹配得到对应的会话;
4)给定查询关键字W,在全部数据源中查询匹配W的数据记录;
5)如果找到包含W的数据源,根据该数据源连接C获得其对应的会话,由该会话生成ORM对象X,该过程由Hibernate完成;X的属性值中包含了W,软件程序可利用X,修改或更新数据值;
6)若未能找到包含W的数据源,则返回空值(NULL)。
作为优选:第一步的第4)步按以下步骤进行:
(1)采用先进先出FIFO方式,在M的最后找到可用的存储空间,置标 记K,若内存空间不足,则错误退出;
(2)为K置锁定标识L,以保证K为C所独占,使得在此其它的连接组件不会强占K位置,导致分配错误;
(3)将C的ID、CS和CO分别放入K的相对应位置;
(4)撤销锁定标记L。
作为优选:第一步的第5)步按以下步骤进行:
(1)在M的ID空间中索引给定ID,若不存在,则错误退出;
(2)找到给定ID后,查找其对应的CS和CO,并将CS注入CO的构造函数,实例化CO;
(3)调用CO的数据库连接方法,到数据库连接池中取出一个可用连接,连接到给定ID指定的数据库。
作为优选:第二步的第4)步设数据库数目为N,查询的约束为K,按以下基于概率统计和目标探测方法确定包含W的数据源:
(1)定义探测函数b(j,z)为对第j个数据源分配时间片zj进行查询的条
件下匹配W成功的概率,定义如下:
其中0<α
j<1,是事先根据数据源j给出的与该数据源访问速度相关的参数,计算过程为:给定数据源j的连接C
j,访问1KB的数据量,从发送查询请求到获得指定数据的时间为t
j,其中建立网络连接和数据在网络上传输的时间为Δt
j,则
b(j,z)指出了在第j个数据源中,分配时间片z
j进行查询, 能成功匹配W的可能性,其中z
j的最优取值
确定按下面的步骤进行;
(2)设关键字W在数据源j中的先验概率为P(j),P(j)的取值可事先根据经验或其它环境条件进行预估;对N个数据源进行编号,使得满足:
α1P(1)≥α2P(2)≥…≥αN′P(N) (2)
(3)令yj=ln[αjP(j)]-ln[αj+1P(j+1)],则 为了计算a值,定义:
则:
作为优选:第三步包括以下步骤:
1)根据该数据源连接组件C,在任务队列中查询得到C对应的会话;
2)调用会话的开始事务方法获取对应的事务T;
3)使用T的隔离属性,实现C与其它数据源连接的隔离;
4)执行存储操作,该操作可以是增加新数据、删除旧数据或修改现有数据;
5)提交存储操作,如果操作成功,则完成存储会话;如果操作失败,则回滚,将数据库重置为提交之前的状态,此时,可再次尝试提交操作。
本发明的有益效果是:通过采用可动态调节数据连接池和连接资源的方 法,可同时完成对多个(不限数量)数据源的高速访问与管理,并通过数据隔离技术,保证多数据源数据传输互不干扰,安全高速,从而克服传统软件对数据源操作的单一性和低效性,可广泛应用于需要同时访问不同数据源数据的软件开发环境,特别是云计算领域中的软件即服务(SoftwareasaService,SaaS)和平台即服务(PlatformasaService,PaaS)环境。
具体实施方式
为了便于本领域技术人员的理解,下面结合附图和具体的实施例对本发明做进一步的说明。
本发明提出了一种多数据源动态隔离访问方法,实现对多个不同数据源的动态隔离访问,其使用的现有技术主要涉及如下方面:
1.数据库连接组件
数据库连接组件用于实现与指定数据库的连接,原始的数据库连接组件是单一的,一次只能连接一个独立的数据库服务器。目前主要的数据库连接组件包括:
1)ODBC:开放数据库互连(OpenDatabaseConnectivity,ODBC)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。
2)JDBC:JavaDataBaseConnectivity,java数据库连接。是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
3)原生数据库连接:由各数据库厂商提供的针对本厂商服务的原生态数据库连接接口,一般包括不同编程语言扩展。如Oracle的OCI接口、MySQL的MySQLConnector等。
本发明支持根据软件系统的需要,使用不同的数据库连接组件实现对数据库的连接与访问。
2.数据库连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
值得注意的是,数据库连接池的主要目的是提高数据库访问速度,但并不能实现同时访问多个不同的数据源,因此,多个不同的数据库需要多个数据库连接池。
本发明使用数据库连接池技术,与数据库连接组件结合,共同实现对数据库高效的连接与访问。
3.对象关系映射(ORM)
对象关系映射(Object-RelationshipMapping,ORM)是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关XS系。因此,ORM以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
在现有ORM技术中,Hibernate是较为成熟的ORM框架。Hibernate是一个开放源代码的对象关系映射框架,它对数据库连接组件进行了非常轻量级的对象封装,使得软件程序可以随心所欲的使用对象编程思维来操纵数据库,并完成数据持久化的任务。
本发明采用Hibernate作为ORM框架,实现对象-关系映射,为软件程序提供面向对象的数据访问组件。
4.事务管理
数据库事务(DatabaseTransaction),是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻 辑工作单元要成为事务,必须满足原子性、一致性、隔离性和持久性四大属性。
本发明采用Hibernate基于会话(session)的事务管理技术。Session技术可以实现在一个ORM操作数据源的过程中对数据库事务进行管理,包括事务的创建、提交或回滚等。
本发明将按照多数据源动态连接、多数据源动态查询和多数据源隔离存储三个阶段进行详细描述:
1、多数据源动态连接阶段
1)根据数据库和软件系统需要选择合适的数据库连接组件C,并记录唯一标识该连接的ID号、代表该连接的字符串CS和组件对象CO,其中,CO中包括一个以CS为参数的构造函数,并封装了对所连接数据库的操作方法,包括连接的创建与销毁。
2)在内存中申请一段空间M,包括三个组成部分,分别存储ID、CS和CO,该段空间以连续方式存储,以ID为索引,可根据ID迅速找到对应的数据库C。该空间结构如附图1所示。
3)为C创建数据库连接池。
4)将该连接组件加入到M中,步骤如下:
(1)采用先进先出(FIFO)方式,在M的最后找到可用的存储空间,置标记K,若内存空间不足,则错误退出;
(2)为K置锁定标识L,以保证K为C所独占,使得在此其它的其它连接组件不会强占K位置,导致分配错误。
(3)将C的ID、CS和CO分别放入K的相对应位置
(4)撤销锁定标记L。
5)当需要动态连接数据库时,需要事先给定连接组件ID,按以下步骤进行:
(1)在M的ID空间中索引给定ID,若不存在,则错误退出;
(2)找到给定ID后,查找其对应的CS和CO,并将CS注入CO的构造函数,实例化CO;
(3)调用CO的数据库连接方法,到数据库连接池中取出一个可用连接,连接到给定ID指定的数据库。
2、多数据源动态查询阶段
不同于传统的单一数据源查询,在多数据源情况下,不能通过单一的SQL语句直接得到目标数据。需要采用本发明设定的多数据源动态查询方法,包括以下步骤:
1)建立Hibernate环境,初始化Hibernate必要参数,使之正常运行,运行成功后,生成基本配置信息(BasicConfiguration)。
2)将第1阶段得到的数据库连接C注入BasicConfiguration,生成与该连接组件唯一对应的配置信息(Configuration),并由Configuration生成ORM工厂(ORMFactory),ORMFactory将自动完成ORM转换,将数据源转化为数据对象X,并生成包含对X进行操作的会话(Session)。如附图2所示。
3)遍历第1阶段生成的M,获取所有数据连接C,重复上一步,得到全部Session队列,由于Session与C的唯一对应关系,可根据C唯一匹配得到对应的Session。
4)给定查询关键字W,需要在全部数据源中查询匹配W的数据记录,设数据库数目为N,查询的约束为K(即可容忍的最长查询时间),按以下基于概率统计和目标探测方法确定包含W的数据源:
(1)定义探测函数b(j,z)为对第j个数据源分配时间片zj进行查询的条件下匹配W成功的概率,定义如下:
其中0<α
j<1,是事先根据数据源j给出的与该数据源访问速度相关的参数,计算过程为:给定数据源j的连接C
j,访问1KB的数据量,从发送查询请求到获得指定数据的时间为t
j,其中建立网络连接和数据在网络上传输的时间为Δt
j,则
b(j,z)指出了在第j个数据源中,分配时间片z
j进行查询,能成功匹配W的可能性,其中z
j的最优取值
确定按下面的步骤进行。
(2)设关键字W在数据源j中的先验概率为P(j),P(j)的取值可事先根据经验或其它环境条件进行预估。对N个数据源进行编号,使得满足:
α1P(1)≥α2P(2)≥…≥αN′P(N) (2)
令yj=ln[αjP(j)]-ln[αj+1P(j+1)],则 为了计算a值,定义:
则:
完成步骤4)后,将得到:在给定最大时间容忍度K的条件下,在N个数据源中查询关键字W的最优方案是对第j个数据源分配的时间片长度为
将有最大概率匹配成功W,该概率为b(j,z)。
5)采用上一步的方法,如果找到包含W的数据源,根据该数据源连接C获得其对应的会话,由该会话生成ORM对象X,该过程由Hibernate完成。X的属性值中包含了W,软件程序可利用X,修改或更新数据值。
6)若未能找到包含W的数据源,则返回空值(NULL)。
3、多数据源隔离存储
该阶段的目的是将数据对象X保存回其来源数据库,在存储过程中利用事务操作保证多数据的隔离性,防止存入其它数据库中,具体包括以下步骤:
1)根据该数据源连接组件C,在会话队列中查询得到C对应的会话。
2)调用会话的开始事务(beginTransaction)方法获取对应的事务T。
3)使用T的Isolation(隔离)属性,实现C与其它数据源连接的隔离。
4)执行存储操作,该操作可以是增加新数据、删除旧数据或修改现有数据。
5)提交(commit)存储操作,如果操作成功,则完成存储任务;如果操作失败,如网络错误、数据库异常等,则回滚,将数据库重置为提交之前的状态,此时,可再次尝试提交操作。
终上所述:本领域的普通技术人员将会意识到,这里所述的实施例是为了 帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。