2011年9月22日星期四

ADF_109:ADF 调优指南之三:参数“Disconnect Application Module Upon Release”的实验报告

在使用AM Pool时,发现数据库连接消耗的特别快。用户每次访问一个页面,都会新占用一个数据库连接,这显然让人无法接受。
查看了有关AM Pool的设置文档,发现参数“Disconnect Application Module Upon Release”与释放数据库连接有很大关系。

参数Disconnect Application Module Upon Release含义
强制AM 实例每次释放回池中时,同时释放掉其对应的JDBC 连接。默认为false,不选中。
好处是每次AM实例不用再从数据库连接池拿连接,而且连prepared statements也可以直接拿来就用。

为了进一步搞清楚问题所在,获得最佳性能,我做了如下实验:
为了最准确的监控数据库连接数,使用如下SQL语句:
conn sys/welcome1 as sysdba;
select count(sid),username from v$session group by username;

实验1. 全部使用默认值

现象:每访问一次页面,数据库连接都增加一个。手工测试了10次,数据库连接增加到了11个。
解释:用户每访问一次页面,都会从AM Pool中获取一个实例,使用完毕后(即Request请求结束后),AM实例会释放回Pool中,但该AM实例所关联的数据库连接并没有释放(方便下次直接使用,不用再从数据库池中获取)。
由于数据库连接池默认很高:4096,所以在达到这个数字前,数据库连接会持续增加。

实验2. 选中Disconnect Application Module Upon Release,其它设置默认。

现象:每访问一次页面,数据库连接都增加一个。手工测试了10次,数据库连接始终为2个。
解释:用户每访问一次页面,都会从AM Pool中获取一个实例,使用完毕后(即Request请求结束后),AM实例会释放回Pool中,同时强制释放该AM实例所关联的数据库。
不好的地方是下次需要数据连接时,需要重新从数据库池中获取。

实验3. 改动参数设置见下图,其它设置默认。
Idle Instance Timeout:设置为1分钟
Pool Polling Interval:设置为30秒
Maximum Instance Time to Live:设置为2分钟。

现象:开始时每访问一次页面,数据库连接都增加一个。手工持续测试了10次,占用数据库连接数达到12个。
经过大约5分钟后,再次手工测试了10次,所占用数据库连接数依然保持达到12个。
这个和我想象的有出入,我以为经过5分钟后,所有的数据库连接都应该释放了,难道是因为AM Pool的最大值太大了,所以总要保留一些AM实例备用?
那我减少AM Pool的最大值,是不是就会把多余的AM实例释放了? 实验4将验证这一猜想。
解释:AM实例不活动时间超过1分钟后,将被标记为“可以清除”,并在30秒后被清除。
值得注意的是,即使AM实例被清除了,它依然关联着一个数据库连接,直到超过了AM的最大生存时间:2分钟后,才释放其所关联的数据库连接。

实验4. 改动了一些有关AM Pool Size的参数,见下图,其它设置与实验3一样。

现象:开始时每访问一次页面,数据库连接都增加一个。手工持续测试了10次,占用数据库连接数最高达到5个。继续测试,仍然是5个。
解释:至于为何是数字5,经多次实验,发现其实与Maximum Available Size参数值无关,这应该是AM Pool优化算法的自然结果。
用5个数据库连接就可以为多个用户提供访问,这才是我们期待的结果。

经过以上实验,结论如下:
(1)Disconnect Application Module Upon Release 参数默认不选中是有利于性能优化的。
(2)参数Idle Instance Timeout、Pool Polling Interval、Maximum Instance Time to Live 应该配合使用。
基本原则是:Maximum Instance Time to Live >Idle Instance Timeout + Pool Polling Interval(否则还没等AM Pool标记清除之前,AM实例就已经被清除了)。
至于何种组合为最优,需要做性能测试之后,比较之后得出。
(3)每个AM 池的设置可以根据自身情况有所不同。
如果AM的调用时间比较长,可以适当增大Maximum Instance Time to Live;Maximum Pool Size 基本接近或略高于用户并发数的峰值;
如果用户并发数很高,可以适当减小Maximum Instance Time to Live,便于回收AM 实例和数据库连接;
对于操作频繁,但事务较小的AM,可以适当增大Idle Instance Timeout、Pool Polling Interval,尽量直接重用AM实例,无需重新获取。
(4)ADF自带的数据库连接池一般不用于生产环境。在生产环境下,应该使用JDBC Datasource的方式,使用WLS的数据库连接池来管理。基本原则是数据库连接池的最大值=AM Maximum Pool Size。

实验说明
本测试是手工测试,参数值的设定仅用于考证Disconnect Application Module Upon Release及相关参数的含义,不能作为生产环境下的参数设置的依据。
生产环境下的参数设置应该做完一系列的性能测试后,逐步调优各项参数,比较之后得出。
本来想用Oracle Application Test Suite 来做压力测试,但安装使用后,发现我的机器根本承受压力测试,呵呵。

参考文献:
1. http://andrejusb.blogspot.com/2010/02/optimizing-oracle-adf-application-pool.html

2011年9月2日星期五

OSB_015:如何解决机器名发生变化时无法访问原有的WebService的问题?

实际使用中,出于某种原因,可能需要修改机器名称,这时,OSB上部署的WebService就无法正常访问了。
目前,在OSB Console中,可以修改访问路径中的path部分,但不允许修改访问路径中的host部分。

因此,只好找寻其它解决办法。
导出Proxy Service的jar文件,

会发现里面的WSDL文件内容中,location指向的是旧的hostname。
<WL5G3N0:service name="getStatusByCC">
<WL5G3N0:port binding="WL5G3N2:execute_pttBinding" name="execute_pt">
<WL5G3N3:address location="http://PMMA-CN.cn.oracle.com:7001/Credit_Services/ProxyServices/ValidateCredit"/>
</WL5G3N0:port>
</WL5G3N0:service>

那么,如何解决这个问题呢?

方案1. 把hostname部分用IP地址替换。
IP地址一般来说,不会轻易改变,如果能够把这里修改成IP地址就好了。
虽然OSB不允许修改hostname,但OSB是运行在WebLogic Server上,只要在WLS Console中,找到OSB所在的Server,把Listen Address设置成IP地址就可以了。


重新启动Server,重新导出Proxy Service的jar文件,发现location指向已经改为IP地址。
<WL5G3N0:service name="getStatusByCC">
<WL5G3N0:port binding="WL5G3N2:execute_pttBinding" name="execute_pt">
<WL5G3N3:address location="http://192.168.1.100:7001/Credit_Services/ProxyServices/ValidateCredit"/>
</WL5G3N0:port>
</WL5G3N0:service>

方案2. 我们很自然的想到把Listen Address设置成新hostname。

重新启动Server,重新导出Proxy Service的jar文件,发现location指向已经改为新的hostname。
<WL5G3N0:service name="getStatusByCC">
<WL5G3N0:port binding="WL5G3N2:execute_pttBinding" name="execute_pt">
<WL5G3N3:address location="http://guo-cn:7001/Credit_Services/ProxyServices/ValidateCredit"/>
</WL5G3N0:port>
</WL5G3N0:service>

说明:为了识别新的hostname,我在hosts文件中增加了一行:127.0.0.1 guo-cn。

方案3. Redirect请求到新的hostname。
在实际情况中,为了高可用性,多个OSB Server组成一个集群,并且请求是由负载均衡器分发过来的。
如果服务所在的hostname发生了变化,我们可以通过设置Redirect来转发所有的请求到负载均衡器,因为负载均衡器“知道”服务的真正地址。
选择Cluster->Configuation->HTTP:

如果不是集群,单独的Server也有这个参数,选择Server->Protocols->HTTP:


参考文献:
1. http://forums.oracle.com/forums/thread.jspa?threadID=963978

2011年9月1日星期四

WebCenter_050:WebCenter Suite 11g 问与答

1. 和外部应用集成时,为了自动登录,难道需要把每个用户的账户/口令都手动配置一遍?

2. 把Mail 集成到Webcenter中,认证似乎有问题,如果使用SSO如何配置?

3. 如何自动刷新portlet?

4. 在Potal应用中有多个Portlet时,如果其中一个比较慢,会导致其它Portlet也比较慢,能否让Portlet先Load,先Show?

5. WebCenter Portal的开发能否做到一站式开发,即把大概框架先定下来,就像WebLogic Portal?

1. 熟悉Portal开发中的Faces组件
2. 熟悉Runtime 编辑portlet的功能,包括所有参数的意义,典型例子,如何美观
3. 熟悉开发、发布 JSR 168 Portlet
4. 熟悉开发、发布 Oracle PDK-Java Portlet
5. 熟悉Portlet之间的通信机制
6. 熟悉在Runtime时,可以增加自己的Portlet,
7. 熟悉在Runtime时,可以增加自己的TaskFlow
8. 熟悉定制化自带的TaskFlow