该章节将阐述ADF BC的AM池如何工作,如何调整AM池及数据库连接池来优化ADF应用。共包含三个部分:
1)介绍AM池。
2)如何设置AM池及数据库连接池的参数。
3)初始化数据库状态及针对池的考量。
4)基于发布环境的调整。
44.1
所谓的AM池是指相同类型AM实例的集合。例如在Funsion Order应用的例子中,基于不同数量用户的访问会有一个或多个AM实例服务于这些用户。由于多个用户使用浏览器提交页面之前都会有思考时间,因此AM实例池可以优化实例的数量,使得共享在多个用户间的实例数量小于用户数以此提高使用效率。这意味着,同时有20个用户使用该系统时,不需要给每个用户都提供一个不同的实例,只需要5-10个AM实例就可以提供服务。因此AM池不仅可以用更少的AM实例服务更多的用户,而且可以根据硬件资源的限制来进行平衡,使得中间层可以使用较少的内存维护少量的AM实例。
AM组件可以处理单个web请求,同时也可以用来处理跨多个页面的复杂交互。由于性能优化的需要,当一个AM实例以"manage state"模式返回AM池时,实例池会记录该实例的session引用。该实例在池里仍然标记为可用,但会优先分配给最后一次使用该实例的session,使用该种称之为“session affinity“的方式会提高系统性能。
根据AM池里的实例状态,可以把它们归为以下三组:
1.无条件可被使用
2.优先被相同session使用
3.无法使用(正被web容器内的其它线程使用)
44.1.1 Funsion Web应用创建的各种类型的池
一个典型的Fusion Web应用通常包含两种类型的池,AM实例池和数据库连接池。理解应用创建多少个每种类型的池非常重要。
44.1.1.1 AM实例池
有两种方式在运行期使用AM组件,
- 客户端的直接访问
- 作为重用组件嵌套到其他AM组件中
当客户端直接访问AM组件时,该组件被称为根组件(root application module)。客户端也可以间接的通过根组件访问嵌套组件。同一AM组件可以同时使用这两种方式运行,但通常不这么做。记住,ADF仅为根组件创建AM实例池。
基本的规则是,每个JVM上的每个Funsion Web应用会为每个根组件创建一个AM实例池。
44.1.1.2 数据库连接池
Fusion Web应用所使用的数据库连接池类型取决于你对AM连接类型的配置信息:
- JDBC URL
- JNDI name for a data source
如果选择JDBC URL方式,那么将使用ADF data connection pool的方式来管理数据库连接。
如果使用JNDI的方式,则不会使用ADF数据库连接池的配置,而将使用中间件应用服务器关于datasource的配置信息。
使用ADF数据库连接池的基本规则是:每个 JVM的根组件的<JDBCURL,Username>将创建一个数据库连接池
44.1.2 理解AM池及数据库连接池
目标平台的配置决定了应用如何分配利用池的种类及数量。例如,由基于多个虚拟机或者多个Weblogic域的应用提供服务给用户的情况下。为了更好的理解在单个及多个JVM运行环境下如何创建池,假设有如下场景:
该Fusion Web应用使用两个APP Module:HRModule及PayablesModule。一个CommonLOVModule包含多个公共的LOV,HRModule及PayableModule为了访问这些LOV引用了该APP Module。配置HRModule及PayablesModule使用相同的数据库定义appuser。两者都是用参数
jbo.passivationstore=database的默认配置,并配置ADF“内部连接“(job.server.internal_connection)用来处理状态管理的持久化,使用和appuser不同的JDBC用户配置。
44.1.2.1 单个Oracle Weblogic域/Weblogic Server实例/JVM
假设所有用户都能访问HRModule及PayablesModule,该应用发布到了单个Weblogic域中,且仅基于一个Weblogic Server实例及JVM,那么会有如下关于该应用的池创建及使用情况:
- 共有两个AM池,一个为HRModule根组件使用,另一个为PayableModule根组件使用。
- 共有两个数据库连接池,一个为appuser,另外一个用来支持state management。
- CommonLOVModule由于仅被其他AppModule所引用,因此没有单独的AM池。
44.1.2.2 多个Oracle Weblogic域/Weblogic Server实例/JVM
假设有四部机器服务于两个Oracle Domain,前端使用负载均衡控制,每部机器包含一个weblogic server实例及一个JVM。用户的请求在两个domain之间共享,每个domain包含两个Weblogic Server实例,那么会有如下的情况:
- 每个JVM都会创建一个HRModule AM池及一个PayablesModule AM池。
- 每个JVM都会创建一个appUser数据库连接池及state Management数据库连接池。
当开始下面AM池参数配置的学习时,谨记这参数只针对单个JVM的AM。
负载均衡会把ADF应用的请求分发到多个JVM去,每个JVM上的AM池需要支持1/n的用户请求(这里的n是指JVM的数量)。当设置这些池的参数时,需要和JVM的数量一并考量。基本的方法是,基于负载测试对AM的测试结果,所需要的AM实例总的数量除以该应用所使用的域及Weblogic Server实例的数量。例如,如果最少需要10个AM实例,且该AM发布在5个Weblogic Server实例上,那么该值应该设置为2而不是10,更多细节请参看下面的信息。
44.2.1 如何设置声明式的配置属性
BC配置对话框里面的Pooling and Scalability页面用来设置AM池及数据库连接池的相关参数,如下图所示:
Figure 44-1 Pooling and Scalability Tab of the Configuration Manager
如何跳到该页面?
在Application导航页面,双击选定的application module。在该application module的概要页面点击”配置“。在“配置”页面里面双击你想编辑的内容,然后在BC配置对话框内选择"Pooling and Scalability“页面。
44.2.2 设置声明式的配置属性会发生什么?
配置信息将会保存到AM组件的定义文所属目录下的common子目录中名为bc4j.xcfg的XML文件,且在同一java包内的所有AM的相关配置信息都会保存到该文件下。
例如,你在Fusion Order示例应用的StoreFront项目中,在目录
.src/oracle/fodemo/storefront/store/service/common中查看bc4j.xcfg文件会发现三个关于StoreServiceAM的配置信息。如下所示:
Example 44-1 Configuration Settings for the StoreService Application Module
<BC4JConfig version="11.1" xmlns="http://xmlns.oracle.com/bc4j/configuration"> <AppModuleConfigBag ApplicationName="oracle.fodemo.storefront.store.service.StoreServiceAM"> <AppModuleConfig DeployPlatform="LOCAL" JDBCName="FOD" jbo.project="StoreFrontService" name="StoreServiceAMLocal" ApplicationName="oracle.fodemo.storefront.store.service.StoreServiceAM"> <Database jbo.locking.mode="optimistic"/> <Security AppModuleJndiName="oracle.fodemo.storefront.store.service.StoreServiceAM"/> </AppModuleConfig> <AppModuleConfig DeployPlatform="LOCAL" JDBCName="FOD" jbo.project="StoreFrontService" name="StoreServiceAMLocalWeb" ApplicationName="oracle.fodemo.storefront.store.service.StoreServiceAM"> <AM-Pooling jbo.ampool.initpoolsize="1"/> <Database jbo.locking.mode="optimistic"/> <Security AppModuleJndiName="oracle.fodemo.storefront.store.service.StoreServiceAM"/> <Custom fod.application.issoaenabled="true"/> </AppModuleConfig> <AppModuleConfig name="StoreFrontService" ApplicationName="oracle.fodemo.storefront.store.service.StoreServiceAM" jbo.project="StoreFrontService" DeployPlatform="SI"> <AM-Pooling jbo.ampool.resetnontransactionalstate="true"/> <Database jbo.SQLBuilder="ORACLE" jbo.locking.mode="optimistic" jbo.TypeMapEntries="Java"/> <Security AppModuleJndiName="oracle.fodemo.storefront.store.service.StoreServiceAM"/> <Custom JDBCDataSource="java:comp/env/jdbc/FODDS"/> </AppModuleConfig> </AppModuleConfigBag> </BC4JConfig>
在这个例子中,StoreServiceAMLocal和StoreServiceAMLocalWeb配置使用了为Oracle ADF Model Tester而配置的JDBC URL链接。数据库连接的具体信息保存在相关项目目录的./.adf/META-INF/connections.xml文件中,第三个配置使用了JDBC Data source。