weblogic 建立datasource时,配置注意事项,记录一下weblogic 的doc。 java
使用管理控制台配置 JDBC 数据源时,WebLogic Server 会根据 JDBC 驱动程序的类型自动选择特定的事务选项: web
支持全局事务:(在默认状况下处于选中状态)若是要在全局事务中使用来自数据源的链接,则选中此选项,即便未选择 XA 驱动程序也是如此。有关详细信息,请参阅使用非 XA JDBC 驱动程序启用对全局事务的支持。 数据库
选中“支持全局事务”时,还必须为 WebLogic Server 选择在处理全局事务时要用于事务分支的协议: 编程
注意: | 多数据源使用的数据源不支持“记录上一个资源”。 |
若是在应用程序中使用全局事务,则应使用 XA JDBC 驱动程序在 JDBC 数据源中建立数据库链接。若是某个 XA 驱动程序不可用于您的数据库,或者您不但愿使用 XA 驱动程序,那么您应在数据源中启用对全局事务的支持。若是应用程序知足如下任何一个条件,则也应启用对全局事务的支持: 安全
WebLogic Server 经过 JDBC 数据源支持“记录上一个资源”(Logging Last Resource,简称 LLR)事务优化。LLR 是一个性能加强选项,使用该选项可以使一个非 XA 资源可以使用与 XA 一样的 ACID 保证参与全局事务。LLR 是“上一个代理优化”的改进结果。它与“上一个代理优化”不一样,由于它对于事务而言是安全的。LLR 资源对其事务工做使用本地事务。WebLogic Server 事务管理器准备事务中的全部其余资源,而后根据 LLR 资源本地事务的结果肯定全局事务的提交决定。 服务器
当为 LLR 配置的数据源中的链接参与两阶段提交 (2PC) 全局事务时,WebLogic Server 事务管理器会经过如下方式完成事务: 并发
可按照使用来自任何其余数据源的 JDBC 链接的方式,在应用程序中使用来自启用了 LLR 的数据源的 JDBC 链接:在开始某个事务以后,在 JNDI 树中查找数据源,而后请求一个来自该数据源的链接。可是,使用 LLR 优化时,WebLogic Server 会在内部管理链接请求,并以不一样于在 XA 事务中使用的处理方式来处理事务处理。 分布式
配置启用了 LLR 的 JDBC 数据源时,请考虑如下要求和限制:
若是须要使用某个 JDBC 数据源来支持分布式事务,但没有符合 XA 标准的驱动程序可供您的 DBMS 使用,则可对某个数据源的“非 XA 驱动程序”选项选择“仿真两阶段提交”,以便对来自该数据源的链接参与的事务仿真两阶段提交。此选项是“常规”选项卡(可经过依次选择“JDBC 数据源”“配置”“常规”选项卡来访问该选项卡)上的高级选项。
对“非 XA 驱动程序”选项选择“仿真两阶段提交”(EnableTwoPhaseCommit设置为true)时,非 XA JDBC 资源老是会在XAResource.prepare() 方法调用期间返回XA_OK。资源会尝试提交或回滚其本地事务以响应后续的XAResource.commit() 或XAResource.rollback() 调用。若是资源提交或回滚失败,则会致使一个试探性错误。应用程序数据可能会因为试探性失败而处于不一致状态。
未在控制台中对“非 XA 驱动程序”选项选择“仿真两阶段提交”(EnableTwoPhaseCommit设置为false)时,非 XA JDBC 资源会致使XAResource.prepare() 失败。当仅有一个资源参与事务时,一阶段优化将跳过XAResource.prepare(),而且在大多数状况下,事务会成功提交。
注意: | 对“非 XA 驱动程序”选项选择“仿真两阶段提交”时,会存在破坏数据完整性的风险。BEA 建议使用符合 XA 标准的 JDBC 驱动程序或“记录上一个资源”选项(而不是使用“仿真两阶段提交”选项)。请确保在启用此选项以前考虑了这些风险。 |
该非 XA JDBC 驱动程序支持一般称为“JTS 驱动程序”,由于 WebLogic Server 在内部使用 WebLogic JTS 驱动程序以支持该功能。
WebLogic Server 使用“仿真两阶段提交”数据源事务选项支持非 XA JDBC 资源参与全局事务,但会存在一些在设计应用程序(以使用这样的数据源)时必须考虑的限制。由于非 XA 驱动程序不符合 XA/2PC 合同,而且仅支持一阶段提交和回滚操做,因此 WebLogic Server(经过 JTS 驱动程序)必须进行妥协以容许资源参与由事务管理器控制的某个事务。
在对“非 XA 驱动程序”选项使用“仿真两阶段提交”以前,请考虑如下限制和风险:
对非 XA 资源选择“仿真两阶段提交”(enableTwoPhaseCommit = true) 时,非 XA 资源的事务准备阶段老是会成功。所以,非 XA 资源没有真正地参与两阶段提交 (2PC) 协议,而且容易失败。若是在准备阶段以后,在非 XA 资源中发生故障,则非 XA 资源可能会在 XA 事务参与者要提交事务时回滚事务,从而致使试探性完成和数据不一致。
因为存在破坏数据完整性的风险,因此,“仿真两阶段提交”选项仅应在可容许出现试探性状况的应用程序中使用。
由于非 XA 驱动程序仅对本地数据库事务进行操做,因此,在有关外部事务管理器的数据库中没有事务待定状态的概念。在非 XA 资源上调用XAResource.recover()时,该方法老是会返回 Xid(事务 ID)的一个空集,即便可能有须要提交或回滚的事务,也是如此。所以,那些在全局事务中使用非 XA 资源的应用程序没法从系统故障中恢复过来,并没有法保持数据完整性。
由于 WebLogic Server 依赖于与特定 JDBC 链接相关联的数据库本地事务来支持全局事务中的非 XA 资源,因此,当某个应用程序经过一个全局事务上下文在多个 WebLogic Server 实例中访问同一 JDBC 数据源时,JTS 驱动程序会始终将 JDBC 操做路由到由该应用程序在事务中创建的第一个链接。例如,若是某个应用程序在一个服务器上启动了某个事务,访问非 XA JDBC 资源,而后对另外一个服务器进行远程方法调用(remote method invocation,简称 RMI)并访问某个使用同一底层 JDBC 驱动程序的数据源,则 JTS 驱动程序会识别出该资源具备与其余服务器上的事务相关联的链接,并会设置一个到第一个服务器上的实际链接的 RMI 重定向。对该链接的全部操做都会对创建在第一个服务器上的一个链接执行。此行为可因为与设置这些远程链接和对一个物理链接进行 RMI 调用相关联的开销而致使性能损失。
将某个非 XA 资源(其“仿真两阶段提交”处于选中状态)注册到 WebLogic Server 事务管理器时,会使用实现 XAResource 接口的类的名称注册该资源。由于其“仿真两阶段提交”处于选中状态的全部非 XA 资源都对 XAResource 接口使用 JTS 驱动程序,因此,会使用同一名称注册全部参与某个全局事务的非 XA 资源(其“仿真两阶段提交”处于选中状态)。若是在某个全局事务中使用多个非 XA 资源,则会致使命名冲突或可能会出现试探性失败。