我之前写过一篇文章《arcsoc进程无限增长导致oracle processes溢出》(见链接:https://www.cnblogs.com/6yuhang/p/9379086.html),后来我觉得没有说清楚,所以有了这一篇文章。
1、问题说明
对于ORACLE数据库,若用户密码已过期(即account_status为' EXPIRED'),当过期之后首次登陆数据库时(若登陆成功,会创建服务端process进程),数据库会要求首先设置新的密码,否则无法创建新的会话(session),如下图:
若Arcgis Server地图服务的数据源是oracle,当用户密码已过期,在地图服务实例新建一个数据库连接后,由于未首先设置新的密码,当前的连接会一直"挂起"在设置新密码的状态。如果service服务还配置了多实例、高隔离等,那么每一个实例在连接数据库时,都会重复上述的过程,即创建了server process,但该process会一直"挂起" 。随着用户请求次数的增多,会导致server process很快超过数据库所设置的processes参数。
2、调整方法
2.1 检查是否有用户密码过期
以sys用户登陆,执行如下的匿名存储过程,检查疑似密码已过期的用户。
declare
tcgs number;
begin
dbms_output.enable(1000000000);
dbms_output.put_line('检查如下用户,他们的密码已过期且用户下存在图层:');
for u in (select username from dba_users where account_status = 'EXPIRED')
loop
execute immediate 'select count(1) from dba_tab_columns where data_type in (''ST_GEOMETRY'' ,''SDO_GEOMETRY'') and owner=:1' into tcgs using u.username;
if tcgs > 0 then
dbms_output.put_line(u.username);
end if;
end loop;
end;
2.2 调整地图服务配置
调整每个服务的配置信息,具体如下:
- 将空间实例可持续运行的最长时间由1800s降低到600s
- 将实例的隔离级别设置为"低隔离性",如下图:
- 可适当降低"每台计算机上最大实例数"。
2.3 将数据库专有连接模式改为共享连接模式
以sys用户登陆,执行如下的命令。
alter system set dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)' scope=both;
alter system set max_dispatchers = 10 scope=both;
alter system set shared_servers = 10 scope=both;
alter system set max_shared_servers = 40 scope=both;
alter system set shared_server_sessions = 100 scope=both;
2.4 使用户密码永不过期
如果管理上允许设置用户密码永不过期,可以sys用户登陆,执行如下命令:
alter profile default limit password_life_time unlimited;