A Application Module Pooling Summary
“ An application module pool is a collection application module instances of the same type.
Application Module Pool 是一个存放有同一类型的 AM 实例的集合。
“ This pool of application module instances is shared by multiple
browser clients whose typical "think time" between submitting web pages allows
optimizing the number of application module components to be effectively smaller
than the total number of active users working on the system. That is, twenty users
visiting the web site from their browser might be able to be serviced by 5 or 10
application module instances instead of having as many application module instances
as you have browser users.
多客户端浏览器的典型的 "think time" 型页面内容的提交就可以共享使用池中的 AM 实例,通过优化 AM 组件的数量就可以达到实际的 AM 数量小于活动的用户数量。也就是我们可以实现 5 到 10 个 AM 的实例来服务 20 个用户,而不是对每一个用户创建一个 AM 的实例。
“ Application module components can be used to support Fusion web application
scenarios that are completely stateless, or they can be used to support a unit of work
that spans multiple browser pages. As a performance optimization, 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 by that particular session. The
application module instance is still in the pool and available for use, but it would prefer
to be used by the same session that was using it last time 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 in use when running a typical Fusion web application, Application Module pools and database 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 实例,节省了切换的时间消耗。 |
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 毫秒。 |