开发环境:JDeveloper 11.1.2.2.0 + Oracle XE Database 10gR2。
默认情况下,每个用户发出一个请求,都会实例化一个新的AM来响应该请求。
与一般的AM不同,Shared AM可以只由一个AM实例来满足多次请求,适用于一些共享和公共的资源,比如公共的LOV:DepartemntLOV,ManagerLOV。
当然,由Shared AM管理这些LOV的前提是:这些LOV的数据基本很少改变,相对是“静态的”。
我们可以把这些公共的VO集中起来,统一交由Shared AM来管理,这样这些LOV将被一直存在于Application或Session范围中,大大减少访问数据库的次数,从而提高性能。
重点步骤说明:
1. 创建要Shared AM的Model Project
先后分别创建两个ADF Model Project:
(1)common.model.hrHrCommonModel:包括HrCommonAppModule AM、Jobs EO、JobsView VO。
(2)common.model.org.OrgCommonModel:包括OrgCommonAppModule AM、Departments EO、DepartmentsView VO。
特别要注意的是:一定要修改默认的Packge路径,不要和其它Package路径发生冲突,因为这些对象都是要被别的Project引用的。
2. 以ADF Library Jar File的形式发布要Shared AM的Model Project
3. 新建一个ADF应用,选择Employees Table
(1)为Model Project导入其它两个Model Project的ADF Library Jar File。
(2)为Model Project添加两个Shared AM,即HrCommonAppModule和OrgCommonAppModule。
注意,Shared AM将自动使用Shared Configuration,即HrCommonAppModuleShared和OrgCommonAppModuleShared,无论默认的配置是否设置的是Local Configuration。
(3)为EmployessView的DepartmentId和JobId分别增加LOV,分别指向OrgCommonAppModule中的DepartmentsView和HrCommonAppModule中的JobsView。
注意:这里只能使用Choice List作为展现形式,而不能使用Input Text with LOV。
因为Shared AM中的LOV是为所有用户服务的,因此必须是只读形式,而不能允许查询,否则会影响其它用户使用。
(4)创建页面,拖放Employee。
4. 为HrCommonAppModuleShared和OrgCommonAppModuleShared的jbo.shared.txn设置同样的值
这样设置后,HrCommonAppModuleShared和OrgCommonAppModuleShared将会共享一个数据库连接。
我觉得不设置这个属性也可以,因为除了第一次使用以外,以后都是从内存中读取LOV,不会再访问数据库。
5. 运行
使用SQL语句查询数据库连接数:select count(sid),username from v$session group by username;
(1)页面第一次Load出来,显示连接数:3。
解释:AppModule、HrCommonAppModule、OrgCommonAppModule各自使用了一个数据库连接。
(2)重新打开一个浏览器,再次访问页面,显示连接数:4。
解释:只有AppModule新增了一个AM实例,该实例使用了一个数据库连接,其它两个AM没有访问数据库。
即两个LOV的数据是从内存读取的,说明Shared AM的确起作用了。
Project 下载: ADF_AM_Shared.7z
参考文献:
1. http://www.oracle.com/technetwork/developer-tools/adf/learnmore/87-lov-using-shared-am-444769.pdf
2. 《Fusion Developer's Guide for ADF》之 Sharing Application Module View Instances
3. http://jobinesh.blogspot.jp/2011/05/two-root-application-modules-sharing.html
4. http://www.avromroyfaderman.com/2008/09/shared-application-module-instance-tricks-part-i-service-methods/
默认情况下,每个用户发出一个请求,都会实例化一个新的AM来响应该请求。
与一般的AM不同,Shared AM可以只由一个AM实例来满足多次请求,适用于一些共享和公共的资源,比如公共的LOV:DepartemntLOV,ManagerLOV。
当然,由Shared AM管理这些LOV的前提是:这些LOV的数据基本很少改变,相对是“静态的”。
我们可以把这些公共的VO集中起来,统一交由Shared AM来管理,这样这些LOV将被一直存在于Application或Session范围中,大大减少访问数据库的次数,从而提高性能。
重点步骤说明:
1. 创建要Shared AM的Model Project
先后分别创建两个ADF Model Project:
(1)common.model.hrHrCommonModel:包括HrCommonAppModule AM、Jobs EO、JobsView VO。
(2)common.model.org.OrgCommonModel:包括OrgCommonAppModule AM、Departments EO、DepartmentsView VO。
特别要注意的是:一定要修改默认的Packge路径,不要和其它Package路径发生冲突,因为这些对象都是要被别的Project引用的。
2. 以ADF Library Jar File的形式发布要Shared AM的Model Project
3. 新建一个ADF应用,选择Employees Table
(1)为Model Project导入其它两个Model Project的ADF Library Jar File。
(2)为Model Project添加两个Shared AM,即HrCommonAppModule和OrgCommonAppModule。
注意,Shared AM将自动使用Shared Configuration,即HrCommonAppModuleShared和OrgCommonAppModuleShared,无论默认的配置是否设置的是Local Configuration。
(3)为EmployessView的DepartmentId和JobId分别增加LOV,分别指向OrgCommonAppModule中的DepartmentsView和HrCommonAppModule中的JobsView。
注意:这里只能使用Choice List作为展现形式,而不能使用Input Text with LOV。
因为Shared AM中的LOV是为所有用户服务的,因此必须是只读形式,而不能允许查询,否则会影响其它用户使用。
(4)创建页面,拖放Employee。
4. 为HrCommonAppModuleShared和OrgCommonAppModuleShared的jbo.shared.txn设置同样的值
这样设置后,HrCommonAppModuleShared和OrgCommonAppModuleShared将会共享一个数据库连接。
我觉得不设置这个属性也可以,因为除了第一次使用以外,以后都是从内存中读取LOV,不会再访问数据库。
5. 运行
使用SQL语句查询数据库连接数:select count(sid),username from v$session group by username;
(1)页面第一次Load出来,显示连接数:3。
解释:AppModule、HrCommonAppModule、OrgCommonAppModule各自使用了一个数据库连接。
(2)重新打开一个浏览器,再次访问页面,显示连接数:4。
解释:只有AppModule新增了一个AM实例,该实例使用了一个数据库连接,其它两个AM没有访问数据库。
即两个LOV的数据是从内存读取的,说明Shared AM的确起作用了。
Project 下载: ADF_AM_Shared.7z
参考文献:
1. http://www.oracle.com/technetwork/developer-tools/adf/learnmore/87-lov-using-shared-am-444769.pdf
2. 《Fusion Developer's Guide for ADF》之 Sharing Application Module View Instances
3. http://jobinesh.blogspot.jp/2011/05/two-root-application-modules-sharing.html
4. http://www.avromroyfaderman.com/2008/09/shared-application-module-instance-tricks-part-i-service-methods/
5. http://www.avromroyfaderman.com/2008/09/shared-application-module-instance-tricks-part-ii-displaying-data/
http://maping930883.blogspot.com/2012/07/adf156amshared-am.html