调整连接池
使用连接池可帮助您降低连接管理开销并减少数据访问的开发任务。每当应用程序尝试访问后端存储器(例如数据库)时,它需要资源以创建、维护和释放与该数据库的连接。为了减轻此过程对整体应用程序资源的影响,应用程序服务器允许管理员在应用程序服务器上建立可以由应用程序共享的后端连接池。连接池在数个用户请求之间分布连接开销,从而节省了应用程序资源以供将来的请求使用。
关于此任务

过程
- 防止连接死锁。 如果应用程序要求每个线程有多个并行连接,但数据库连接池不够大,无法满足线程数的要求时,那么会发生死锁。假设每个应用程序线程需要两个并行数据库连接,且线程数等于连接池最大大小。同时存在下列情况时会发生死锁:
- 每个线程都拥有它自己的第一个数据库连接,且所有的连接都在使用。
- 每个线程都在等待第二个数据库连接,由于所有线程都被阻塞,所以没有一个线程能获得第二个连接。
为了防止在这种情况下发生死锁,数据库连接池的最大连接数值应至少增加一。这确保至少一个等待线程会获得第二个数据库连接以避免死锁情况。
一般情况下,为了防止连接死锁,应用程序应编写为每个线程仅使用一个连接。如果应用程序被编写为每个线程需要 C 个并行数据库连接,那么该连接池必须支持至少以下数目的连接,其中 T 是最大线程数:T * (C - 1) + 1
连接池设置直接与配置数据库服务器支持的连接数相关。如果增大池的最大连接数,但并未据此增大数据库中对应的设置,那么应用程序会失败。生成的 SQL 异常错误显示在以下位置中:发生连接死锁的其中一个最常见原因是,Servlet 和 Enterprise JavaBeans (EJB) 使用了同一个连接池,并且 Servlet 直接或间接地调用该 Bean。例如,从连接池中获取 JMS 连接的 Servlet 将消息发送到消息驱动的 Bean (MDB) 并等待应答。此 MDB 已被配置为与此 Servlet 使用同一个连接池,因此,此 MDB 需要池中的另一个连接将应答发送到此 Servlet。Servlet 与企业 Bean 不共享同一个连接池。这是并行 (C) 个线程的传统情况,其中 C=2,而 T 是 Servlet 和 EJB 线程池的最大大小。stderr.log 文件
服务方的 SYSOUT
- 禁用连接池。
- 对于关系资源适配器 (RRA),请为数据源添加 disableWASConnectionPooling 定制属性。
- 单击 JDBC > 数据源。
- 单击要配置的数据源的名称。
- 单击其他属性标题下的定制属性。
- 单击新建。
- 用以下信息填写必填字段:
- 名称:disableWASConnectionPooling
- 值:true
- 对于其他资源适配器,请参阅该资源适配器的绑定规范以将应用程序配置为禁用连接池。
- 以编程方式通过资源适配器禁用连接池。
- 应用程序服务器利用以下代码来检测 javax.resource.NotSupportedException 异常及禁用连接池:
_managedFactory.matchManagedConnections(s,subject,cri); // 169059 174269 } catch(javax.resource.NotSupportedException e){
- 对于关系资源适配器 (RRA),请为数据源添加 disableWASConnectionPooling 定制属性。
- 启用延迟登记。
在应用程序服务器环境中,延迟登记是指一种技术,即,应用程序先等待连接被使用,然后才在应用程序的工作单元 (UOW) 范围中登记该连接。
请考虑以下延迟登记说明:- 使用延迟登记的应用程序组件从全局事务中调用 getConnection 方法。
- 该应用程序组件不立即使用连接。
- 应用程序发出调用以初次使用连接时,事务管理器将拦截该调用。
- 事务管理器将登记该连接的 XA 资源并调用 XAResource.start 方法。
- 与 XA 资源关联的连接管理器将调用发送至数据库。
在已获取连接但未在 UOW 范围内使用该连接的情况下,延迟登记会提供更好的性能。该方法可节省必须参与到 UOW 中之前的事务参与成本。
如果您要了解资源适配器是否提供此功能,请与资源适配器提供程序联系。应用程序服务器关系资源适配器自动支持延迟登记。
代码中包含延迟获取功能:
Java™ Platform, Enterprise Edition (Java EE) 连接器体系结构 (JCA) V1.5 和更高版本规范将延迟登记技术称为迟钝事务登记优化。此支持来自于标记接口 (LazyEnlistableManagedConnection) 和连接管理器上的方法 (LazyEnlistableConnectionManager()):package javax.resource.spi; import javax.resource.ResourceException; import javax.transaction.xa.Xid; interface LazyEnlistableConnectionManager { // application server void lazyEnlist(ManagedConnection) throws ResourceException; } interface LazyEnlistableManagedConnection { // resource adapter }
- 控制连接池共享。 可以将 defaultConnectionTypeOverride 或 globalConnectionTypeOverride 连接池定制属性用于特定连接工厂或数据源以控制连接共享:
- defaultConnectionTypeOverride 属性更改连接池的缺省共享值。此属性使您能够为直接查询控制连接共享。如果为此数据源或连接工厂配置了资源引用,那么资源引用的配置优先于 defaultConnectionTypeOverride 属性设置。例如,如果应用程序执行直接查询并且需要非共享连接,请将 defaultConnectionTypeOverride 属性设置为 unshared。
- 对 globalConnectionTypeOverride 定制属性指定的值优先于所有其他连接共享设置。例如,如果将此属性设置为 unshared,那么对于直接查询和资源引用查找而言,所有连接请求都是非共享请求。此属性允许您快速测试将特定数据源或连接工厂的所有连接置于非共享或共享状态的结果,而不必更改资源引用设置。
如果同时对 defaultConnectionTypeOverride 和 globalConnectionTypeOverride 属性指定值,那么只有对 globalConnectionTypeOverride 属性指定的值用于确定连接共享类型。
要将这些新的定制属性添加到数据源或连接工厂连接池的设置中,必须创建一个新连接池定制属性。要将其中一个属性添加到数据源中,请使用管理控制台。单击资源 > JDBC > 数据源。从列表中选择数据源,然后单击其他属性 > 连接池属性 > 连接池定制属性 > 新建。对于其他 J2C 或 JMS 连接工厂,请在管理控制台中浏览至连接工厂定义。然后选择其他属性 > 连接池 > 连接池定制属性 > 新建。现在,指定名称字段中的 defaultConnectionTypeOverride 或 globalConnectionTypeOverride,并指定值字段中的 shared 或 unshared。要点: 必须在连接池定制属性中设置这些属性,而不能在数据源或连接工厂的常规定制属性中设置。 当连接池无法与其已配置的资源管理器建立连接时,自动执行缓和操作。
可以通过使用 failureNotificationActionCode 和 failureThreshold 属性来配置连接池,以便在连接工厂无法建立与其已配置的资源管理器的连接时,WebSphere® Application Server for z/OS® 运行时执行自动迁移操作,以使故障对最终用户的影响最小。当连接工厂能够重新建立与已配置的资源管理器的连接时,将撤销自动迁移操作。此类型的迁移操作的一个示例如下:运行时可以对具有失败资源的服务器发出“pause listeners”命令,以阻止该服务器接受新工作。与高可用性前端组合使用时,可以将新的工作路由至集群中的其他服务器。
当特定连接工厂或数据源达到指定的故障阈值或缺省故障阈值时,将向 z/OS 运行时发送通知。故障通知包括一个已配置的操作码,用于确定该运行时如何响应故障通知。请参阅主题“连接池定制属性”,以了解操作码定义。
要使用这些属性,必须将他们定义为连接池的新定制属性。可以通过管理控制台按如下所示执行此操作:单击 JDBC 提供程序 > 数据源 > 连接池 > 定制属性 > 新建。然后,在名称字段中指定 failureNotificationActionCode 或 failureNotification,并在值字段中指定适当的值。
要更多地了解这些定制属性的设置,请参阅主题“连接池定制属性”。
- 废弃连接。
“收集时间”和“未使用超时”设置不会在服务方区域处于空闲状态时导致空闲连接或未使用的连接被废弃。此情形可能导致某些 DB2 连接的维持时间大于所需时间。
如果您希望在由“收集器时间”和“未使用超时设置”组合所指定的时间废弃连接(即使此首选项可能导致空闲服务方区域再次变为活动状态,但您仍希望如此时),可以向 JDBC 驱动程序提供程序数据源设置添加 nondeferredreaper 定制属性。当添加此定制属性时,将在由“收集器时间”和“未使用超时”设置组合确定的时间废弃连接。
要向 JDBC 驱动程序提供程序数据源设置添加此定制属性,请在管理控制台中单击资源 > JDBC 提供程序 > DB2 通用 JDBC 驱动程序提供程序 > 数据源 > data_source > 定制属性 > 新建。然后,在名称字段中指定 nondeferredreaper,在值字段中指定 true,并在类型字段中指定 java.lang.Boolean。 只有在重新启动使用此数据源的服务器之后,此新设置才会生效。
避免故障: 单纯为废弃未使用连接而激活空闲服务方区域,这有时可能导致额外的 CPU 使用。此外,可能会记录以下警告消息,但可以忽略:
gotchaDSRA8200W: DataSource Configuration: DSRA8020E: Warning: The property 'nondeferredreaper' does not exist on the DataSource classcom.ibm.db2.jcc.DB2ConnectionPoolDataSource.
- 根据清除策略来清除连接池。
对异常映射配置了连接池错误检测模型时,旧的连接异常指示连接不再有效。
通常,当异常映射进程产生 StaleConnectionException 结果时,会触发连接错误事件,随后会清除连接池。但是,在这种情况下,已启动 SCE,现有代码无法触发连接错误事件,当连接在数据库端终止时,不会清除连接池;请求建立新连接时,驱动程序会抛出 XAException。如果 errorDetectionModel=ExceptionMapping 结果,那么将触发 ConnectionErrorEvent,以便根据清除策略来清除连接池。
要向 JDBC 驱动程序提供程序数据源设置添加此定制属性,请在管理控制台中单击资源 > JDBC 提供程序 > DB2 通用 JDBC 驱动程序提供程序 > 数据源 > data_source > 定制属性 > 新建。然后在名称字段中指定 fireCEEventOnSCE,在值字段中指定 true,并在类型字段中指定 java.lang.Boolean。只有在重新启动使用此数据源的服务器之后,此新设置才会生效。
已更改 WebSphere RRA 代码,以便在使用 ExceptionMapping 作为 errorDetection 模型的情况下发生 StaleConnectionException 时正确清除连接池。
子主题


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_conpoolman
文件名:tdat_conpoolman.html