用于在集群数据库环境中提供会话亲和性和改善的连通性的系统和方法

文档序号:6495614阅读:274来源:国知局
用于在集群数据库环境中提供会话亲和性和改善的连通性的系统和方法【专利摘要】集群数据库环境(例如,Oracle?Real?Application?Cluster(RAC))包括表现为一个服务器的多个数据库实例。应用服务器(例如,WebLogic?Server(WLS))可以使用数据源(例如,Oracle?GridLink数据源)和连接池来与集群数据库进行连接。根据一实施例,数据源配置允许指定优选亲和性策略,诸如数据亲和性、时间亲和性,和/或会话或基于会话的亲和性策略。根据一实施例,系统包括若干个改善集群数据库环境中的应用连通性的特征,包括对于应用连续性的只选择情况,其中,例如,在Java数据库连接(JDBC)驱动程序内实现的独立于应用的基础设施允许工作从应用角度来恢复,并掩盖系统通信,硬件故障以及挂起。【专利说明】用于在集群数据库环境中提供会话亲和性和改善的连通性的系统和方法[0001]版权声明[0002]此专利文献的公开的一部分包含受版权保护的材料。由于本专利文献或专利公开出现在美国专利商标局的专利文件或记录中,版权所有者不反对任何人对其进行复制,但在其他方面保留所有版权权益。[0003]优先权声明:[0004]本申请要求2012年2月16日提交的标题为“SYSTEMANDMETHODFORPROVIDINGSESSIONAFFINITYINACLUSTEREDDATABASEENVIRONMENT”的美国专利申请N0.13/398,538和2012年2月16日提交的标题为“SYSTEMANDMETHODFORIMPROVINGCONNECTIVITYINACLUSTEREDDATABASEENVIRONMENT”的美国专利申请N0.13/398,606的优先权,这两个申请中每一个都要求2011年6月27提交的标题为“SYSTEMANDMETHODFORPROVIDINGIMPROVEMENTSINUSINGADATASOURCEWITHANAPPLICATIONSERVERANDCLUSTEREDDATABASE”的美国临时专利申请N0.61/501,583的优先权;通过引用的方式并入上述每一件申请。发明领域[0005]本发明总体上涉及诸如数据库、中间件,以及集群数据源的计算机系统和软件,更特别地,涉及将数据源用于应用服务器和集群数据库的各种改善。[0006]相关申请:[0007]本申请涉及2011年9月15提交的标题为“SYSTEMINCLUDINGAMIDDLEWAREMACHINEENVIRONMENT”的美国专利申请N0.13/234,027,该申请要求2010年9月15日提交的标题为“MIDDLEWAREMACHINEPLATFORM”的美国临时专利申请N0.61/383,285以及2010年9月17日提交的标题为“MIDDLEWAREMACHINEPLATFORM”的美国临时专利申请N0.61/384,227的优先权;以及2011年6月24日提交的标题为“SYSTEMANDMETHODFORUSINGAGRIDLINKDATASOURCETOCONNECTANAPPLICATIONSERVERWITHACLUSTEREDDATABASE”的美国专利申请N0.13/168,506的优先权,通过引用的方式并入上述每一件申请。[0008]背景:[0009]诸如OracleRealApplicationCluster(RAC)之类的产品可用于实现集群数据库环境,该环境又向终端用户应用提供可扩展性和高可用性。集群数据库还可以与诸如WebLogicServer(WLS)之类的其他产品集成,以提供应用服务器/集群数据库环境。这些是本发明的各实施例旨在解决的大致领域。【
发明内容】[0010]本发明一般涉及诸如中间件、以及集群数据源之类的计算机系统和软件,尤其涉及将数据源用于应用服务器和集群数据库的各种改善。[0011]集群数据库环境(例如,OracleRealApplicationCluster(RAC))包括表现为一个服务器的多个数据库实例。应用服务器(例如,WebLogicServer(WLS))可以使用数据源(例如,OracleGridLink数据源)以及连接池来与集群数据库进行连接。通知服务广播描述数据库实例中的状态变化的通知,然后,该通知被数据源以及连接池用来控制对数据库实例的访问。[0012]根据一实施例,数据源配置允许指定首选的亲和性策略,诸如数据亲和性、时间亲和性、和/或会话或基于会话的亲和性策略。使用会话亲和性策略来提供在web会话的环境下进行的数据库访问的数据库实例亲和性,即,会话亲和性是时间亲和性的一种形式,其中,当应用可能正对特定数据集执行多个相关的更新的,数据库操作被定向到特定实例。由于增多的本地缓存使用率,可以使用将这样的操作定向到单一数据库实例来改善应用性倉泛。[0013]根据一实施例,系统包括若干个改善集群数据库环境中的应用连通性的特征,包括对于应用连续性的只选择情况,其中,例如,在Java数据库连接(JDBC)驱动程序内实现的独立于应用的基础设施允许工作从应用角度来恢复,掩盖系统通信、硬件故障以及挂起。【专利附图】【附图说明】:[0014]图1示出了根据一实施例的包括用于连接应用服务器与集群数据库的数据源的系统的图不。[0015]图2示出了根据一实施例的使用亲和性设置来将多个应用服务器和/或数据源与集群数据库一起使用的图示。[0016]图3示出了根据一实施例的包括Web应用并支持用于数据源和集群数据库的web会话亲和性的系统的图示。[0017]图4示出了根据一实施例的示例web会话亲和性交互的图示。[0018]图5示出了根据一实施例的用于提供web会话亲和性的方法的流程图。[0019]图6示出了根据一实施例的包括用于连接应用服务器与集群数据库的数据源以及驱动程序重播特征的系统的图示。[0020]图7示出了根据一实施例的包括用于连接应用服务器与集群数据库的数据源以及用于重播选择数据的驱动程序重播特征的系统的另一个图示。[0021]图8示出了根据一实施例的用于提供驱动程序重播特征的方法的流程图。【具体实施方式】:[0022]根据一实施例,集群数据库环境(有时称为数据库集群)包括一个或多个互连的计算机或服务器,它们一起在终端用户和终端用户应用看起来好像它们是单一服务器。与一般在数据库存储器和数据库实例之间提供一对一关系的单一实例数据库不同,集群数据库可以在数据库存储器和多个数据库实例之间提供一对多关系。[0023]例如,OracleRealApplicationCluster(RAC)数据库系统使用OracleClusterware基础设施将多个服务器绑定到一起,来聚集Oracle数据库,以便服务器可以作为单一系统来操作。RAC数据库系统可包括许多数据库实例,其中每一个都可以访问单一数据库存储器。如此,这样的多个服务器的组合的处理能力可以提供比使用单一服务器所能实现的更大的吞吐量和可缩放性。[0024]根据一实施例,数据源(在此处所描述的多个示例中被称为GridLink数据源,虽然也可以使用其他形式的数据源)可以被用来连接诸如WebLogicServer(WLS)实例之类的应用服务器与集群数据库。通知服务可以被集群数据库用来广播描述多个其数据库实例内的任何状态变化的通知(诸如在OracleRAC产品内使用的FastApplicationNotification或“FAN”通知或事件)。数据源包括管理到集群的数据库中的多个数据库实例的一组连接的连接池。数据源可以向通知服务进行注册以接收有关集群数据库的变化的通知。然后,应用服务器根据运行时的集群数据库的任何状态变化自适应地配置和/或管理到集群数据库的连接。[0025]图1示出了根据一实施例的包括用于连接应用服务器与集群数据库的数据源的系统的图示。如图1所示,数据源104(在此示例中,称为GridLink数据源,虽然也可以使用其他形式的数据源)与应用服务器101相关联。[0026]数据源利用或通过应用服务器来简化集群数据库102的使用,并降低使用集群数据库所需的配置和管理复杂性。数据源包括连接池106,该连接池106又提供到数据库集群中的不同的数据库实例114,116,118的一组不均匀连接128,129。相应地,不同的数据库实例又可以连接到单一、或共享存储器120。[0027]对连接池中的连接的管理可基于在连接池上配置的静态设置112,诸如最小/最大容量、或超时;和/或基于从通知服务124接收到的事件消息126中所描述的有关连接池的实时信息,该信息通知数据源有关数据库集群内的状态变化。[0028]当应用108、110从数据源请求连接时,可以基于,例如,连接池接收到的负载平衡信息,和/或来自池中的正在使用中的连接的当前分布,从连接池中选择合适的连接,并向应用提供。[0029]在一个说明性示例中,可以使用上面的系统来提供Oracle数据库服务,其中,数据库服务可以提供对于,例如,工作负荷,对于工作负荷的优先级排序,对于真实事务的性能度量,以及当性能目标被违犯时的告警和动作的单一系统映像。数据库服务可以使数据库管理员能作为单一实体来配置、管理、启用/禁用,以及测量工作负荷。数据库服务可以进一步用于将工作负荷分割为逻辑分组,其中,每一个服务都以公共属性、服务级别阈值,以及优先级来表示工作负荷。应用服务器可以接收由集群数据库所发出的负载平衡咨询事件消息,并相应地调整到数据库节点或实例的数据库连接。然后,系统可以在运行时对数据源执行负载平衡配置,允许应用服务器基于从数据库接收到的负载平衡咨询消息来调度数据库连接。然后,数据库连接可以被定向到特定数据库节点,以满足由数据库管理员所设置的性能目标。[0030]在另一个示例中,系统可以支持分布式事务(XA)亲和性,确保在全局事务的环境内对数据库集群执行的所有数据库操作都被定向到同一个数据库实例。可以基于全局事务id,而不是通过单个数据源,来确立这样的XA亲和性,以确保从不同的数据源获得的为相同数据库集群配置的连接都与同一个数据库实例相关联,或者对集群数据库执行的对于全局事务的所有数据库操作都被定向到同一个数据库实例。例如,对于XA事务的第一连接请求可以被负载平衡,并被指派亲和性环境。所有随后的连接请求都可以使用第一连接的亲和性环境被路由到同一个数据库实例。[0031]除上面的特征之外,系统还可以使用附加特征以及功能,诸如使用通用连接池(UCP)库作为将应用服务器连接到集群数据库的连接模块。一般而言,从数据库服务器的角度来看,UCP库表现为客户端侧库,在逻辑上,是用于连接到数据库的Java数据库连接(JDBC)驱动程序的扩展。除提供通用JDBC连接池实现之外,这样的数据库连接模块的使用还可以为集群数据库支持高可用性和性能能力。[0032]在2011年6月24日提交的标题为“SYSTEMANDMETHODFORUSINGAGRIDLINKDATASOURCETOCONNECTANAPPLICATIONSERVERWITHACLUSTEREDDATABASE”的美国专利申请N0.13/168,506中提供了对包括上面的特征以及功能中的某些的数据源系统的各实施例的附加描述,此处通过引用的方式将其内容合并于此。[0033]集群数据库环境中的会话亲和性[0034]根据一实施例,系统支持会话亲和性与web会话的一起使用。如此处所引用的,会话或基于会话的亲和性是时间亲和性的一种形式,其中,当应用可能正对特定数据集执行多个、相关的更新的一段时间内,由应用所请求的数据库操作被定向到特定数据库实例。可以使用将这样的操作定向到单一数据库实例来利用增多的本地缓存使用率,并改善总体的应用性能。[0035]图2示出了根据一实施例的其中使用一个或多个亲和性设置来将多个应用服务器和/或数据源用于集群数据库的环境的图示。如图2所示,应用服务器环境140可包括一个或多个应用服务器实例142、162。每一应用服务器实例都可包括一个或多个数据源144、164,其中每个数据源都有其自己的连接池146、166,以及连接池设置154、174。数据源将应用150,170的连接158,178一起提供到集群数据库,并以无限制的方式支持对数据库服务的消费,以便在应用和集群数据库之间提供深度集成。[0036]根据一实施例,每一个数据源都还可以与可以每个数据源级别地或跨应用服务器环境内的所有或多个数据源或应用服务器指定的一个或多个亲和性设置156,176相关联。可以使用的亲和性方案的示例包括XA亲和性,以及会话或基于会话的亲和性。[0037]在Web应用的环境中,web会话的生命期可以是Web应用和数据库之间的相对长时间的交互,诸如用户对电子商务购物车特征的操作。当使用会话亲和性时,系统在该web会话的生命期内保留亲和性环境。这提供了应用性能优点,因为系统在该特定web会话过程中将始终回到同一个数据库实例,并利用该数据库上的本地缓存。使用这样的会话亲和性特征的其他优点包括缩短数据库上的集群等待时间,以及在RAC的环境中,较少地依赖于同步RAC集群数据集。[0038]根据一实施例,用于支持会话亲和性及其他亲和性方案的亲和性信息,可以由计划跨集群复制的其FAN通知或事件以及任何负载咨询等等内的通知服务推出。在某些实现中,系统可以从正在被各种应用所使用的数据中提取键,并基于那些键,将连接路由到合适的服务器。在某些实现中,系统还可以在运行时利用UCP来提供应用可以实现的应用回调API,然后,在运行时,为它回调应用,以便提供可以被用来确定合适的路由的键。[0039]根据一实施例,可以跨多个数据源全局性地,或为每一个数据源分别地定义亲和性策略。亲和性策略定义哪一种类型的亲和性(如果有的话)将在运行时被该数据源使用。根据计划用于Web应用的实施例,会话亲和性被设置为数据源环境内的每一个数据源上的默认亲和性策略。全局策略设置优先于每个资源策略设置。[0040]在运行时,当应用从设置了会话亲和性策略(具体而言,或默认地)的数据源请求连接时,系统进行回调以获取任何可用的web会话环境。如果这样的web会话环境可用,则系统可以使用其来选择最合适的连接;否则,系统可以使用,例如,UCP,来基于诸如运行时负载平衡之类的其他因素,来选择连接。取决于系统的配置,然后,可以为该web会话设置亲和性环境,如此,下一次应用发出请求时,会话在其环境中具有合适的会话亲和性信息。[0041]在诸如WebLogic环境之类的环境中,会话可以不在内部传递。在这样的环境中,系统可以使用诸如工作环境之类的利用请求在系统周围传播的功能。servlet容器可以根据坚持所述web会话的所述工作环境确定是否设置了亲和性策略,如果设置了的话,则适当地设置工作环境,并检索附加信息,以选择最合适的连接。[0042]图3示出了根据一实施例的包括与web会话一起用于数据源和集群数据库的Web应用的系统的图示。如图3所示,每一应用服务器实例可包括一个或多个数据源203,其中每个数据源都有其自己的连接池205,以及连接池设置210。当执行Web应用206,并且在web会话208过程中数据源连接作为请求的一部分被调用时,如果正在使用会话或基于会话的亲和性212,则连接被返回到应用216,供在会话218过程中使用。在应用请求的执行完成之后,并且在servlet容器完成其响应之前,容器将任何现有的基于会话的亲和性环境保存到会话和/或保存到工作环境图,以便亲和性环境与会话相关联,在该同一个web会话内供随后的请求220使用。[0043]图4示出了根据一实施例的示例web会话亲和性交互的图示。根据一实施例,可以定义一组亲和性回调接口,例如,在oracle,ucp封装中。根据一实施例,数据源和亲和性实现使用getConnectionAffinityContext和setConnectionAffinityContext方法来管理与应用环境的亲和性环境关联。对于每一个连接预留请求,调用getConnectionAffinityContext方法以判断是否有与应用环境(例如,全局事务或web-会话)相关联的亲和性环境。如果没有,那么,选择连接,随机地或根据运行时连接负载平衡,利用标识所选数据库(例如,RAC)实例的环境对象来调用setConnectionAffinityContext方法。然后,亲和性策略实现与应用环境一起存储实例信息,供在下一连接预留请求上使用。如图4所示,当由servlet容器接收到请求时,servlet容器将在执行应用servlet/jsp之前初始化(init)或还原工作环境(工作环境存储在会话内部属性和图中)。在240,执行应用,并调用数据源.getConnectionO方法。在242,由数据源(在此示例中,为GridLink数据源)调用SessionAffinityCallback.getAffnityContextO。第一次,没有存储“AffinityContext”,如此,244返回空值。在246,由数据源调用SessionAffnityCallback.setAffinityContext(...),存储affinityContext,在此示例中,存储到工作环境图。在248,连接返回到应用。在250,如果由应用再次调用getConnectionO,可以从工作环境图获取affinityContext,然后,返回相同连接。在252,在应用请求的执行完成之后并且在servlet容器完成响应之前,servlet容器将任何现有的“AffinityContext”保存到会话和图,以便亲和性环境与会话相关联,供随后的请求254、256使用。[0044]根据一实施例,亲和性环境包含下列键值:服务名称,以及数据库唯一名称。这些被用来检查正确的数据库和服务,当对于该实例aff=true时,返回实例id。如果一个环境有一个浏览器,那么,下一签出(checkout)请求应该检查这些属性以匹配。例如,如果与以前的环境不同的服务涉及另一个服务,则可以使用另一个实例。RAC中的计算是每服务的,而不是跨服务的。如果有许多浏览器窗口,则每一个浏览器窗口都应该具有其自己的环境信息,并维护与其自己的数据库和服务的亲和性。[0045]在WebLogic环境的示例中,为支持RAC会话亲和性特征,亲和性环境可以与HTTP会话相关联。在此示例中,亲和性环境包含数据库名称、实例名称、服务名称等,并被用来从RAC获取连接。对于相同HTTP会话中的请求(cookie标头或查询参数或URL中的相同JSESS10NID),可保证getConnectionO返回相同连接。终端用户是否正在使用一个或多个浏览器和多个浏览器窗口没关系;会话亲和性横跨相同数据库和服务的多个数据源。[0046]图5示出了根据一实施例的用于提供web会话亲和性交互的方法的流程图。如图所示,在步骤260中,执行应用,并调用数据源连接。在步骤262中,如果没有存储的亲和性环境,那么,将基于会话的亲和性环境存储到工作环境图中,连接返回到应用。在步骤264中,如果连接再次由应用调用,则从工作环境图中获取基于会话的亲和性环境,然后,返回相同连接。在步骤266中,在应用的执行完成之后并且在servlet容器完成其响应之前,该容器将任何现有的基于会话的亲和性环境保存到会话和图,以便亲和性环境与会话相关联,供随后的请求使用。[0047]根据一实施例,可以定义API,供内部组件使用,以实现会话和数据亲和性策略。“会话”亲和性策略(默认)表示亲和性环境应该与Web应用的持续时间会话环境相关联,并用于该会话环境。此策略可以代替XA亲和性使用,并在web会话过程中适用于所有事务性的数据源使用。当在web会话的环境之外访问带有会话亲和性策略的数据源时,亲和性策略将后退到XA亲和性。[0048]根据一实施例,WLS数据源子系统提供用于管理亲和性回调注册的方法,亲和性回调注册计划用于集成特定亲和性策略的其他内部组件。回调注册是全局的,并适用于部署在带有亲和性策略的服务器上的所有GridLink数据源。在任何给定时间只能注册每一种类型的一个回调。将基于数据源的优选亲和性策略,在连接预留时间,调用特定回调,用于亲和性环境处理。尝试利用事务的策略类型注册回调实现将导致阻止当前XA亲和性实现的可能的过量负荷的异常。[0049]根据一实施例,亲和性处理只在RAC实例正在生成正确的事件时执行。这通过负载平衡咨询FAN事件中的RAC实例的“aff”标记被设置为真来表示。为使得确定何时为RAC实例启用亲和性更加容易,可以向运行时MBean中添加AffEnabled属性。[0050]Java编程接口[0051]根据一实施例,下面提供了用于上文所描述的会话亲和性特征的Java编程接口的示例。示例Java编程接口是为说明和描述目的而提供的,而不意在详尽的公开或将本发明限于所公开的准确的形式。publicinterfaceJDBCOracleParamsBeanextendsSettableBean[0052]包含数据源的Oracle数据库相关的参数。数据源的Oracle特定的行为的配置参数可以使用Oracle参数bean来指定。[0053]publicjava.lang.StringgetAffinityPolicy()[0054]指定用于数据源的亲和性策略。选项可包括:指定事务亲和性的Transaction;指定web会话亲和性的Session(默认);以及指定数据亲和性的Data。[0055]publicvoidsetAffinityPolicy(StringaffinityPolicy)[0056]publicbooleanisAffEnabled()[0057]从最近的负载平衡咨询事件返回亲和性属性。[0058]publicinterfaceConnectionAffinityCallback[0059]OracleRAC亲和性的回调接口。[0060]publicbooleansetConnectionAffinityContext(ObjectaffinityContext)[0061]设置亲和性环境。参数可包括affinityContext-不透明的环境对象。如果环境对象被成功地设置,则返回真,否则,返回假。[0062]publicjava.lang.0bjectgetConnectionAffinityContext()[0063]返回亲和性环境对象。[0064]publicvoid[0065]setAffinityPolicy(ConnectionAffinityCallback.AffinityPolicypoIicy)[0066]设置用于该回调的亲和性策略。参数可包括policy-要使用的亲和性策略。[0067]public[0068]oracle,ucp.ConnectionAffinityCallback.AffinityPoIicygetAffinityPolicy0[0069]从该回调获得当前亲和性策略。返回为该回调设置的亲和性策略。[0070]publicbooleanisApplicationContextAvailable()[0071]检查是否存在此亲和性策略的应用环境。如果存在此策略的应用环境,则返回真,否则,返回假。[0072]publicstaticfinalclassConnectionAffinityCallback.AffinityPolicyextendsEnum[0073]publicstaticoracle,ucp.ConnectionAffinityCallback.AffinityPolicy[]values()[0074]publicstaticoracle,ucp.ConnectionAffinityCallback.AffinityPoIicyvalueOf(Stringname)[0075]publicinterfaceDataBasedAffinityCallbackextendsAffinityCallback[0076]OracleRAC数据亲和性的回调接口。[0077]publicbooleansetDataKey(ObjectkeyObject)[0078]在该回调实现内设置应用所使用的数据键对象。参数可包括keyObject-数据键对象。如果数据键对象被成功地设置,则返回真;否则,返回假。[0079]publicintgetPartitionld()[0080]获取基于数据的亲和性的逻辑分区标识符。返回在上面的该回调内部设置的数据键特定的逻辑分区标识符。[0081]publicinterfaceAffinityCallbackextendsConnectionAffinityCallback[0082]OracleRAC亲和性的回调接口。AffinityCallback接口是用于向数据源服务注册亲和性提供者的基接口。该接口扩展UCPConnectionAffinityCallback接口,并定义额外的方法。可以细分现有的UCP亲和性实现以实现AffinityCallback接口。[0083]publicbooleanisApplicationContextAvailable()[0084]检查是否存在此亲和性策略的应用环境。如果存在此策略的应用环境,则返回真,否则,返回假。[0085]publicinterfaceDataAffinityCallbackextendsAffinityCallback,[0086]DataBasedConnectionAffinityCallback[0087]OracleRAC数据亲和性的回调接口。[0088]publicinterfaceDatasourceService[0089]内部数据源服务操作。组件应该使用此服务接口以获取信息,并对数据源子系统执行全局操作。[0090]publicvoidregisterAffinityCallback(AffinityCallbackcallback)[0091]注册将由为亲和性配置的所有数据源调用的全局亲和性回调。参数可包括callback-要注册的回调实例。[0092]publicbooleanunregisterAffinityCallback(AffinityCallbackcallback)[0093]取消注册指定的亲和性回调。参数可包括callback-要取消注册的回调实例。如果先前注册了回调,则返回真,否则,返回假。[0094]publicvoidregisterDataAffinityCallback([0095]DataBasedConnectionAffinityCallbackcallback)[0096]注册将由为亲和性配置的所有数据源调用的全局数据亲和性回调。参数可包括callback-要注册的回调实例。[0097]publicbooleanisAffinityPoIicyDeployed([0098]ConnectionAffinityCallback.AffinityPolicypolicy)[0099]返回是否利用指定的亲和性策略在当前服务器上部署了数据源。[0100]参数可包括policy-部署的数据源的亲和性策略。如果利用指定的策略部署了数据源,则返回真,否则,返回假。[0101]publicvoidregisterAffinityPolicyListener([0102]AffinityPolicyListenerlistener,[0103]ConnectionAffinityCallback.AffinityPolicypolicy)[0104]为指定的亲和性策略注册亲和性策略听者回调。每当指定的亲和性策略的部署状态变化时,将调用回调。在第一次注册之后立即调用回调。参数可包括listener——要注册的回调实现;以及policy—要监听的亲和性策略。[0105]publicbooleanunregisterAffinityPolicyListener([0106]AffinityPolicyListenerlistener)[0107]取消注册指定的策略听者回调。参数可包括listener——要取消注册的听者回调。如果注册了指定的回调,则返回真,否则,返回假。[0108]publicinterfaceAffinityPolicyListener[0109]实现可以向DatasourceService注册,以当部署或撤销部署带有特定亲和性策略的数据源时接收通知。[0110]publicvoidaffinityPolicyNotification([0111]ConnectionAffinityCallback.AffinityPolicypolicy,booleandeployed)[0112]当特定亲和性策略的部署状态有变化时调用。参数可包括policy-对其应用通知的亲和性策略;以及employed——数据源是否部署了亲和性策略。[0113]集群数据库环境中改善的应用连通性[0114]根据一实施例,系统包括驱动程序(例如,JDBC)重播特征,该特征提供通用、独立于应用的基础设施,该基础设施允许从应用角度对工作进行恢复,并掩盖许多系统、通信,以及硬件故障和挂起。语义帮助确保终端用户事务可以准时并且至多一次执行。净结果是,终端用户应该看到服务中的中断的唯一一次是当停机以致于没有必要继续。[0115]图6示出了根据一实施例的包括用于连接应用服务器与集群数据库的数据源以及驱动程序重播特征的系统的图示。如图6所示,数据源282(在此示例中,称为GridLink数据源,虽然再次可以使用其他形式的数据源)提供与应用服务器280相关联的单一数据源,用于集群数据库202。数据源再次包括连接池284,该连接池284又提供到数据库集群中的不同的数据库实例114、116、以及118的一组不均匀连接;而不同的数据库实例又可以连接到单一、或共享存储器120。[0116]根据一实施例,系统进一步包括被各种连接用来访问数据库实例的JDBC驱动程序286。当应用290从数据源请求连接时,可以基于,例如,连接池通过FAN通知接收到的负载平衡信息,和/或来自池中的正在使用中的连接的当前分布,从连接池中选择合适的连接,并向应用提供。然后,应用会话292可以通过连接池和JDBC驱动程序向数据库发出请求294,并接收然后返回到应用的对应的响应或结果295。[0117]根据一实施例,在应用使用web会话的操作过程中,如果连接故障或失效,则JDBC驱动程序记录由应用从数据库先前查询了什么信息或数据的状态287,并将会话重播到该点,以处理对数据库的查询,以便应用本身不会看到任何错误或异常。[0118]根据一实施例,该特征对非事务性的只读或只选择情况特别有用,虽然根据其他实施例,类似的技术可以用于事务性的情况,虽然不计划用于事务,但是可以扩展以支持那些情况。取决于使用情况的复杂性(例如,只读与事务性的,简单与复杂的会话),在使用JDBC驱动程序重播时可能会有性能和存储器影响(hit),如此,关于稍微较低的性能与改善的应用连续性和较少的应用中断进行折衷。(如上文所描述的,根据一实施例,系统实现Java特定的应用服务器特征,该特征与诸如OracleJDBC驱动程序之类的JDBC驱动程序一起工作。根据其他实施例,可以使用其他驱动程序,例如,在Tuxedo系统的环境中的OCIOracle驱动程序。)[0119]图7示出了根据一实施例的包括用于连接应用服务器与集群数据库的数据源以及用于重播所选择数据的驱动程序重播特征的系统的另一个图示。如图7所示,应用通过连接池和JDBC驱动程序作出从集群数据库的数据库实例中选择数据的请求,JDBC驱动程序记录来自数据库实例的只读或选择数据的结果。如果系统随后确定应用已经丢失其到数据库实例的连接296,则JDBC驱动程序使用响应于先前接收到的应用请求存储在JDBC驱动程序中的数据来重播298应用请求和响应,直到该会话的该点。[0120]图8示出了根据一实施例的用于提供驱动程序重播特征的方法的流程图。如图8所示,在步骤302中,应用通过连接池和JDBC驱动程序作出从集群数据库的数据库实例选择数据的请求。在步骤304中,JDBC驱动程序将来自数据库实例中的只读或选择数据的结果记录在驱动程序存储器空间本身内。在步骤306中,系统随后判断应用已经丢失其到数据库实例的连接。在步骤308中,响应于应用请求而预先存储在JDBC驱动程序中的数据被JDBC驱动程序用来重播应用请求和响应,直到该会话的该点。[0121]根据一实施例,上面的功能可以主要在,例如,Oracle数据库驱动程序和服务器中,或其他形式的JDBC或数据库驱动程序上实现。然后,诸如WebLogicServer之类的应用服务器可以暴露接口以帮助控制驱动程序重播特征,并参与区分需要恢复的工作。[0122]根据一实施例,普通Oracle驱动程序/数据源类可以替换为“oracle,jdbc.replay.0racIeDatasourceImpI”类。管理控制台将指出,如果选择此驱动程序,则忽略XA。终端用户或管理员可以使用控制台,或文本编辑器或以编程方式(例如,WLST)来指定正确的驱动程序,并提供进一步的配置。[0123]虽然上文所描述的各实施例示出了只读情况的驱动程序重播特征的使用,但是,根据其他实施例,驱动程序重播特征也可以用于数据更新情况。[0124]为创建连接初始化回调,应用可以实现oracle,ucp.jdbc.ConnectionlnitializationCallback接口。每个连接池创建一个回调。接口提供如下面所示的一个方法:[0125]voidinitialize(java.sql.Connectionconnection)throwsSQLException如果为连接池注册了标记回调,则忽略它。否则,在从池中签出每一连接,以及在重播中可恢复错误之后的每一个成功的重新连接时,执行它。通过在运行时和在重播时使用相同回调,确保在运行时重建当建立原始会话时使用的正好相同的初始化。确保是这种情况是回调的的实施者的责任。如果回调调用失败,则在该连接上禁用重播。下列示例演示了简单初始化回调实现。[0126]importoracle,ucp.jdbe.ConnectionlnitializatioiiCallback;classMyCcmnectionInitializationCallbackimplementsConnectionlnitiaiizatiοnCaliback{publicMyConnectionlnitializationCallback(){}publicvoidinitialize(java.sql.Connectionconnection)throwsSQLException{//Re-setthestatefortheconnection,ifnecessary}[0127]}[0128]WLS数据源提供用于注册初始化回调的registerConnectionlnitializationCallback(ConnectionlnitializationCallbackcallback)方法。只可在连接池上注册一个回调。下列示例演示了注册在MyConnectionInitializationCalIback类中实现的初始化回调:[0129]importweblogic.jdbc.extensions.WLDataSource;[0130]MyConnectionInitializationCallbackcallback=new[0131]MyConnectionInitializationCallback();[0132]((WLDataSource)ds).registerConnectionlnitializationCallback(callback);[0133]回调也可以通过图式(schema)通过Oracle参数中的新连接_初始化_回调元素来配置。WLS数据源提供用于移除初始化回调的removeConnectionlnitializationCalIback()方法。下列示例演示了移除初始化回调。[0134]importweblogic.jdbc.extensions.WLDataSource;[0135]((WLDataSource)ds).unregisterConnectionlnitializationCallback(callback);[0136]根据一实施例,WebLogicServer能够实现并注册oracle,jdbc.replay,internal.ConnectionInitializationCallback。initialize。方法将调用ConnectionLabelingCallback实现,如果注册的话。否则,initializeO方法将调用ConnectionlnitializationCallback实现,如果注册的话。如果标记回调没有注册,当由池放出连接时,也应该调用初始化回调。WLS将在连接上调用beginRequest和endRequest以归类(bracket)连接上的工作。如果利用开放事务进行调用,或者如果自从最后一个beginRequest或将连接返回到池以来一直没有endRequestO,则beginRequest返回错误。endRequest是连接可以替换为新连接的声明。[0137]接收到此标记允许重播驱动程序对于记录采取下列动作,用于重播:清除事务历史和累积的purge-on-close(懒惰的)光标。这只清除记录的Call历史。它不涉及通过重新执行任何JDBC方法,SQL、或PL/SQL,改变连接的状态;如果重播被禁用,清除禁用重播的保存的原因(错误代码);禁用重播。在下一beginRequest调用时,重播将被启用;如果利用开放事务进行调用(由事务比特确定),则返回错误;在重复的endRequest调用中不返回错误,因为这些可能是合法的错误和会话关闭的结果。可以按如下方式以每个连接为基础禁用重播。[0138]if(connectioninstanceoforacle,jdbc.replay.ReplayableConnection){[0139]((oracle,jdbc.replay.ReplayableConnection)connection).disableReplay();[0140]}[0141]Java编程接口[0142]根据一实施例,下面提供了上文所描述的JDBC驱动程序重播特征的Java编程接口的示例。示例Java编程接口是为说明和描述目的而提供的,而不是详尽的公开或将本发明限于所公开的准石角的形式。〈elementname=〃connection-1nitialization_callback〃type=〃string〃nillable=〃true〃min0ccurs=〃0〃>[0143]连接初始化回调的名称。当创建数据源时,这自动地传递到registerConnectionInitializationCallback。[0144]publicinterfaceConnectionlnitializationCallback[0145]在从池中签出的每一连接处,以及在重播中可恢复错误之后的每一个成功的重新连接处,调用的API。[0146]voidinitialize(java.sql.Connectionconnection)throwsSQLException[0147]在从池中签出的每一连接处,以及在重播中可恢复错误之后的每一个成功的重新连接处调用。通过在运行时和在重播时使用相同回调,确保在运行时重建当建立原始会话时使用的正好相同的初始化。确保是这种情况是回调的实施者的责任。如果回调调用失败,则在该连接上禁用重播。[0148]publicStringgetConnectionlnitializationCallback();[0149]publicvoidsetConnectionlnitializationCallback();[0150]本发明可以使用一个或多个常规通用或专门数字计算机、计算设备、机器,或微处理器,包括一个或多个处理器、存储器和/或根据本发明的原理编程的计算机可读存储介质,来方便地实现。对于软件行业的技术人员来说显而易见的是,可以由熟练的程序员基于本发明的原理轻松地编制适当的软件代码。根据一些实施例,根据本发明开发的系统和组件可包括计算机硬件、软件、固件,或任何其组合,或可以实现为它们或作为它们来提供。[0151]在某些实施例中,本发明包括计算机程序产品,该产品是其中存储了指令的存储介质或计算机可读介质,这些指令可以用来对计算机进行编程,以执行本发明的任何一个进程。存储介质可以包括,但不仅限于,任何类型的盘,包括软盘、光盘、DVD、⑶-ROM、微驱动,以及磁光盘、ROM、RAM、EPROM、EEPR0M、DRAM、VRAM、闪存设备、磁卡或光卡,纳米系统(包括分子存储器1C),或者适于存储指令和/或数据的任何类型的介质或设备。[0152]前面的对本发明的描述只是为了说明和描述。它不是详尽的说明或将本发明限于所公开的准确的形式。本领域的技术人员将认识到,可以进行许多修改。所选择和描述的实施例只是为了最好地说明本发明的原理以及其实际应用,并使本领域的其他技术人员懂得,可以设想具有适合于特定用途的各种修改的各实施例的发明。本发明的范围由下面的权利要求以及它们的等效内容进行定义。【权利要求】1.一种用于在数据源和集群数据库环境中支持会话亲和性的系统,包括:集群数据库系统,以及与其中的多个数据库实例相关联的通知服务,其中,所述通知服务被用来广播描述所述集群数据库中的状态变化的通知;应用服务器,以及与其相关联的数据源和连接池,其中,所述数据源和连接池被用来管理到所述集群数据库中的所述多个数据库实例的连接,以及其中,所述数据源可以使用会话或基于会话的亲和性,其中,当应用可能在执行对特定数据集的多个相关更新时,在一段时间内,数据库操作被定向到特定数据库实例。2.如权利要求1所述的系统,其中,可以跨多个数据源全局性地,或者为每一个数据源单独地定义亲和性策略,其中,所述亲和性策略定义哪一种类型的亲和性将在运行时被所述数据源使用。3.如权利要求2所述的系统,其中,在运行时,当应用从设置了会话亲和性策略的所述数据源请求连接时,所述系统进行回调以获取任何可用的web会话环境,并且如果这样的web会话环境可用,则所述系统可以使用所述web会话环境来选择最合适的连接。4.如权利要求3所述的系统,其中,所述系统可以使用利用请求在所述系统周围传播的诸如工作环境之类的功能,其中,servlet容器可以根据坚持所述web会话的所述工作环境确定是否设置了亲和性策略,并且如果设置了的话,则适当地设置工作环境,并检索附加信息,以然后选择最合适的连接。5.一种用于在数据源和集群数据库环境中支持会话亲和性的方法,包括下列步骤:提供对集群数据库系统,以及与其中的多个数据库实例相关联的通知服务的访问,其中,所述通知服务被用来广播描述所述集群数据库中的状态变化的通知;提供应用服务器,以及与其相关联的数据源和连接池,其中,所述数据源和连接池被用来管理到所述集群数据库中的所述多个数据库实例的连接,以及其中,所述数据源可以使用会话或基于会话的亲和性,其中,当所述应用可能在执行对特定数据集的多个相关更新时,在一段时间内,数据库操作被定向到特定数据库实例。6.如权利要求5所述的方法,其中,可以跨多个数据源全局性地,或为每一个数据源单独地定义亲和性策略,其中,所述亲和性策略定义哪一种类型的亲和性将在运行时被所述数据源使用。7.如权利要求6所述的方法,其中,在运行时,当应用从设置了会话亲和性策略的所述数据源请求连接时,所述系统进行回调以获取任何可用的web会话环境,并且如果这样的web会话环境可用,则所述系统可以使用所述web会话环境来选择最合适的连接。8.如权利要求7所述的方法,其中,所述系统可以使用利用请求在所述系统周围传播的诸如工作环境之类的功能,其中,servlet容器可以根据坚持所述web会话的所述工作环境确定是否设置了亲和性策略,并且如果设置了的话,则适当地设置工作环境,并检索附加信息,以然后选择最合适的连接。9.一种非瞬时的计算机可读介质,包括存储在其上的指令,当被一台或多台计算机读取和执行时,所述指令使得所述一台或多台计算机执行包括下列各项的步骤:提供对集群数据库系统,以及与其中的多个数据库实例相关联的通知服务的访问,其中,所述通知服务被用来广播描述所述集群数据库中的状态变化的通知;提供应用服务器,以及与其相关联的数据源和连接池,其中,所述数据源和连接池被用来管理到所述集群数据库中的所述多个数据库实例的连接,以及其中,所述数据源可以使用会话或基于会话的亲和性,其中,当所述应用可能在执行对特定数据集的多个相关更新时,在一段时间内,数据库操作被定向到特定数据库实例。10.一种用于在数据源和集群数据库环境中提供改善的应用连通性的系统,包括:集群数据库系统,以及与其中的多个数据库实例相关联的通知服务,其中,所述通知服务被用来广播描述所述集群数据库中的状态变化的通知;应用服务器,以及与其相关联的数据源和连接池,其中,所述数据源和连接池被用来管理到所述集群数据库中的所述多个数据库实例的连接,以及其中,在应用使用web会话的操作过程中,如果所述连接故障或失效,则数据库驱动程序记录先前由所述应用从所述数据库查询了什么的状态,并重播所述会话到该点,以处理所述查询或更新所述数据库,以便所述应用本身看不到任何错误或异常。11.如权利要求10所述的系统,其中,所述特征用于非事务性的只读或只选择情况。12.如权利要求1所述的系统,其中,所述数据库驱动程序是JDBC驱动程序。13.如权利要求12所述的系统,其中,所述JDBC驱动程序将来自所述数据库实例的只读或选择数据的结果记录在所述驱动程序存储器空间本身内。14.一种用于在数据源和集群数据库环境中提供改善的应用连通性的方法,包括下列步骤:提供对集群数据库系统,以及与其中的多个数据库实例相关联的通知服务的访问,其中,所述通知服务被用来广播描述所述集群数据库中的状态变化的通知;提供应用服务器,以及与其相关联的数据源和连接池,其中,所述数据源和连接池被用来管理到所述集群数据库中的所述多个数据库实例的连接,以及其中,在应用使用web会话的操作过程中,如果所述连接故障或失效,则数据库驱动程序记录先前由所述应用从所述数据库查询了什么的状态,并重播所述会话到该点,以处理所述查询或更新所述数据库,以便所述应用本身看不到任何错误或异常。15.如权利要求14所述的方法,其中,所述特征用于非事务性的只读或只选择情况。16.如权利要求15所述的方法,其中,所述数据库驱动程序是JDBC驱动程序。17.如权利要求16所述的方法,其中,所述JDBC驱动程序将来自所述数据库实例的只读或选择数据的结果记录在所述驱动程序存储器空间本身内。18.—种非瞬时的计算机可读介质,包括存储在其上的指令,当被一台或多台计算机读取和执行时,所述指令使得所述一台或多台计算机执行包括下列各项的步骤:提供对集群数据库系统,以及与其中的多个数据库实例相关联的通知服务的访问,其中,所述通知服务被用来广播描述所述集群数据库中的状态变化的通知;提供应用服务器,以及与其相关联的数据源和连接池,其中,所述数据源和连接池被用来管理到所述集群数据库中的所述多个数据库实例的连接,以及其中,在应用使用web会话的操作过程中,如果所述连接故障或失效,则数据库驱动程序记录先前由所述应用从所述数据库查询了什么的状态,并重播所述会话到该点,以处理所述查询或更新所述数据库,以便所述应用本身看不到任何错误或异常。【文档编号】G06F17/30GK103917972SQ201280029715【公开日】2014年7月9日申请日期:2012年6月27日优先权日:2011年6月27日【发明者】A·索莫贾伊,N·雷瓦那鲁,S·费尔茨,周彤申请人:甲骨文国际公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1