A Application Module Pooling Summary
“An application module pool is a collectionapplication module instances of the same type.
Application Module Pool是一个存放有同一类型的AM实例的集合。
“This pool ofapplication module instances is shared by multiple
browser clients whose typical "thinktime" between submitting web pages allows
optimizing the number of application modulecomponents to be effectively smaller
than the total number of active usersworking on the system. That is, twenty users
visiting the web site from their browsermight be able to be serviced by 5 or 10
application module instances instead ofhaving as many application module instances
as you have browser users.
多客户端浏览器的典型的"think time"型页面内容的提交就可以共享使用池中的AM实例,通过优化AM组件的数量就可以达到实际的AM数量小于活动的用户数量。也就是我们可以实现5到10个AM的实例来服务20个用户,而不是对每一个用户创建一个AM的实例。
“Application module components canbe used to support Fusion web application
scenarios that are completely stateless, or they can beused to support a unit of work
that spans multiple browser pages. As a performanceoptimization, when an instance
of an application module is returned to the pool in"managed state" mode, the pool
keeps track that the application module is referenced bythat particular session. The
application module instance is still in the pool andavailable for use, but it would prefer
to be used by the same session that was using it lasttime because maintaining this
so-called "session affinity" improves performance.
AM组件可以做为一个完全无状态(stateless)的组件来服务Fusion Web Application,或者是做为有状态(stateful)的组件用来支持一系列的多页面的场景。
AM组件在池中的状态(state)有三种:
a)无条件的可用
b)可用,但是只能被活动的用户Session使用的Session Affinity实例
c)不可用,因为他当前正在被使用中
B Type of Pools
“There are two kinds of pools inuse when running a typical Fusion web application, Application Module pools anddatabase connection pools.
当我们运行一个典型的Fusion web application时会产生两种不同类型池,AM实例池和数据库连接池!
A)AM 实例池
运行时访问AM组件有两种方式:
一.做为一个AM允许客户端直接访问
二.做为一个可重用的组件聚合(或内嵌)到另一个AM实例中。
需要指出的是ADF只为Root的AM来创建AM实例池,基本的rule是ADF为每个Controller层使用到的Root级的AM在每一个JVM中创建一个实例池。
下面会详细介绍各个参数的含义。
B)数据库连接池
数据库连接池也有两种方式:
一.通过JDBC URL来使用
二.通过JNDI NAME
当使用JDBC URL时ADF会通过AM的配置文件的参数来管理数据库连接池,而使用JNDI NAME时会使用服务器中数据源的配置。
数据库连接池中的参数在这里不会被介绍到!
C The parameters of the AM pool
1) Pool Behavior Parameters
Parameter | Description |
Failover Transaction State Upon Managed Release Jbo.dofailover | 在"Managed State"模式下,每次当处于pending transaction state的AM实例被释放到池中时执行"钝化"[eager passivation]. ADF的Fusion web applications应该打开这个选项(设置为True)来允许任何其它的AM在任何时间都可以"激活"[activate]它的状态。 这个选项默认为False! |
Row-Level Locking Behavior Upon Release Jbo.locking.mode | 使用了行级锁[row-level lock]的AM实例每次在释放到池中时强制AM实例池不去在数据库中创建一个pending transaction state。 ADF的Fusion web application应该设置锁定模式为“乐观锁”去避免创建一个行级锁。 这个选项默认为False! |
Disconnect Application Module Upon Release Jbo.doconnectionpooling | 强制AM实例池在AM实例每次释放时池中时释放掉他对应的JDBC连接。 这个选项默认是False! |
Enable Application Module pooling Jbo.ampool.doampooling | 使用AM实例池,当你发布你的应用到生产环境时,默认就会设置为True。但是在测试的时候可以设置为False,从而可以发现更多的问题。 这个选项默认为False! |
Support Dynamic JDBC Credentials Jbo.ampool.dynamicjdbccredentials | 允许程序在新的用户Session开始的时候通过代码来修改数据库的连接凭证(用户名/密码) 这个选项默认为True!但是要实现这个特性必须要额外的添加代码。 |
Reset Non-Transactional State Upon Unmanaged Release Jbo.ampool.resetnontransactionalstate | 强制AM重置所有的Non-Transactional State,比如VO的运行时设置,JDBC的Prepared Statements,绑定变量等。这时AM实例会做为一个未管理的或是无状态“Stateless”的形式被放回到池中。 这个选项默认是True,关闭这个选项会提高性能,但是这样就不会清除绑定变量的值,你的应用必须确保绑定变量的值设置是正确的,如果你无法保证的话,就有可能会出现一个用户看到另外一个用户设置的绑定变量的值。 |
2)Pool Sizing Parameters
Pool Configuration Parameter | Description |
Initial Pool Size Jbo.ampool.initpoolsize | 当AM实例池初始化时AM实例的个数。 默认值是0,一个基本是思路是设置他的数值为你的系统预期的并发量的10% 这个参数的主要功能是在初始化时花费一定的CPU时间来生成指定个AM的实例,而不是在需要的时候再去创建AM的实例。 |
Maximum Pool Size Jbo.ampool.maxpoolsize | AM实例池最大可以容纳的个AM实例的个数,当超过这个值时就不会再创建任何的AM实例了。 默认值是5000。 |
Referenced Pool Size Jbo.recyclethreshold | 当一个用户Session使用的AM实例以Managed-State模式放回到池中后再被与这个Session相关的下一次请求取出的AM的最大实例数 这个值总是应该小于等于最大的Size。默认为10. 设置这个值的最大好处是可以节省切换AM实例从这个用户的Session到另外一个用户的Session上面去。也可以理解为为一个用户的Session指定了特定的AM实例,节省了切换的时间消耗。 (一个Session能够使用的最大AM数,也是数据库链接数。) |
Maximum Instance Time to Live Jbo.ampool.timetolive | AM实例有池中存活的最大毫秒值,当AM池现存的实例数大于设置的最小可用值时,这个实例就会从池中移除出去。 默认值是3600000毫秒,这个默认值适用与大部分程序。 |
3)Pool Cleanup Parameters
Pool Configuration Parameter | Description |
Pool Polling Interval jbo.ampool.monitorsleepinterval | 池中的资源被清除的时间间隔,以毫秒为单位。 当池中的实例始终小于设置的最大实例数时,任何一个AM实例都不会被清除掉 默认值是600000毫秒,设置的值更小时就会引起更频繁的移除操作,从而减少内存的占用量,设置更大值就会更少的去清除。 |
Maximum Available Size jbo.ampool.maxavailablesize | 正常情况下AM池中最大可用的AM实例个数。 当清除操作发生时,就会将清除可用的AM实例,直到达到低于这个水平。 默认值为25. |
Minimum Available Size jbo.ampool.minavailablesize | 正常情况下AM池中最小可用的AM实例个数。 当清除操作发生时,就会将超过这个设置的可用的实例清除掉,直到达到这个水平为止。 设置为0时清除操作就会清空整个AM实例池。 默认值为5。 |
Idle Instance Timeout jbo.ampool.maxinactiveage | AM池中达到这个毫秒值不活动的AM的实例将做为候选人在下一次清除操作执行时被清除掉。 默认值是600000毫秒。 |
转自:http://huraky.iteye.com/blog/577791