探查 JDBC Multipool 问题

负载平衡算法
采用负载平衡算法的 MultiPool 以 Round Robin 方式提供其连接,各连接在为其定义的所有 JDBC 连接池之间均匀分布。如果对某个连接的连接测试失败,MultiPool 会尝试从列表中的下一个池中提供连接。以下位置提供了更多详细信息:http://e-docs.bea.com/wls/docs81/jdbc/programming.html#1023962 (English)。

因此,负载平衡既具有在若干个池间分配负载的长处,又能够在其中一个池不可用时提供一定程度的 Failover 能力。不过,如果采用负载平衡算法,将无法控制 MultiPool 响应来自其列表中不同池的连接请求的顺序及其 Failover 的目标池。

MultiPool 的限制
若要为 MultiPool 启用高可用性算法,需要考虑一些限制和前提条件。http://e-docs.bea.com/wls/docs81/jdbc/programming.html#1068130 (English) 中提供了详细信息。下面是对上述要点的总结:
  • 启用 JDBCConnectionPool 上的 TestConnectionsOnReserve(MultiPool 的一部分),以便 MultiPool 可以检测到连接失败及 Failover 到列表中下一个 JDBC 连接池的必要性。
     
  • MultiPool 的名称在域配置内必须是唯一的。不应以相同名称命名 JDBC 连接池和 MultiPool,因为那样会导致 Failover 故障。
     
  • 如果第一个池中的所有连接都处于使用状态,MultiPool 将不会从列表中的下一个池提供连接。只有在 MultiPool 配置中的 JDBC 连接池的数据库发生故障或某个池被暂停使用时,才会提供 Failover。
    不过,WebLogic Server 8.1 SP3 及更高版本中添加了一个新属性FailoverRequestIfBusy,可以通过该属性配置 MultiPool,从而实现当某个池中的所有连接都处于使用状态时,从列表中的下一个池中提供连接。WebLogic Server 版本 8.1 SP3 及更高版本中针对 MultiPool 的增强功能中对此有更为详尽的描述。
     
  • 当某个应用程序从 MultiPool 中得到了一个连接后,在该应用程序使用该连接期间,将不再为该连接执行 Failover。这是因为 MultiPool 在连接测试期间调用 getConnection() 时检测到连接失败。后面阶段出现的数据库故障需要由应用程序处理,其步骤与用于正常 JDBC 连接池的步骤相同。由于数据库崩溃或关闭时会将事务回滚,因此应用程序需要对这种情况进行处理,并重新执行相关工作。
  • 分布式事务中不支持 MultiPool,请参阅:http://e-docs.bea.com/wls/docs81/jdbc/intro.html#1029935 (English) 和 http://e-docs.bea.com/wls/docs81/ConsoleHelp/jdbc_multipools.html#1105912(English)。
     
  • 由于 Oracle 不能保证在针对负载平衡配置驱动程序的情况下一个事务在同一 RAC 节点上发起和结束,因此分布式事务中不支持使用 Oracle RAC/TAF 的 MultiPool。请参阅以下位置提供的详细信息:http://e-docs.bea.com/wls/docs81/jdbc/oracle_rac.html#1053178 (English)。
     
  • 在属于 MultiPool 的所有 JDBC 连接池中设置<ConnectionCreationRetryFrequencySeconds="0">。由于针对高可用性配置的 MultiPool 正常情况下会在向数据库发出的连接请求失败后 Failover 到列表中的下一个池,因此设置连接创建重试间隔会降低效率并使 MultiPool 无法进行 Failover。请参阅以下位置提供的附加信息:http://e-docs.bea.com/wls/docs81/jdbc/programming.html#1068305 (English)。如果对 MultiPool 的其中一个 JDBC 连接池设置了连接创建重试间隔,则会显示下面这样的错误信息:

 

java.sql.SQLException: Pool connect failed :
weblogic.common.ResourceException: testMultiPool(myMultiPool):
weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool myMultiPool to allocate to applications, 
please increase the size of the pool and retry..
at weblogic.jdbc.common.internal.JDBCUtil.wrapAndThrowResourceException(JDBCUtil.java:160)

阅读全文……

你可能感兴趣的:(weblogic,AppServer)