造成此错误的原因分为两种情况:
4.8.3.1:ARCSDE最大连接数超限
windows 操作系统中sde服务的最大连接数为48个。
一般来说不可能同时有这么多用户一起连接图形数据库。并且我们的系统以及ARCMAP或ARCCATALOG等桌面软件在退出的时候也会删除与数据库的连接。但为什么还会出现超出最大连接数的问题呢?在经过多次的尝试之后发现:当系统异常退出,或连接上图形数据库时强行拔除网线等非常规操作时。SDE服务器上的连接进程以及数据库中记录的SDE的用户连接数等记录无法删除。导致无效的连接越来越多,最终达到了他的极限,出现错误在所难免。
解决办法如下:
临时解决办法1.重启SDE服务或删除SDE服务所在机器上的GSRVR.EXE进程。
永久方法一:用PLSQL或TOAD打开SDE用户下的表SEVER_CONFIG,编辑字段 CONNECTIONS值为你的最大连接数。设置字段TCPKEEPALIVE值为TRUE或1(推荐此方法)
永久方法二:打开SDE的安装目录下的(一般安装路径为C:\ arcgis\ArcSDE\sqlexe\etc)giomgr.defs文件进行编辑,设置CONNECTIONS参数为你的最大连接数。然后设置 TCPKEEPALIVE参数为TRUE。 通过命令导入到数据库中:sdeconfig –o import –f C:\arcgis\ArcSDE\sqlexe\etc\giomgr.defs –i esri_sde(数据库实例名) –s (ServerName) –u sde(用户名) –p sde(密码) 。 设置好后需要重启SDE服务才能生效。
TCPKEEPALIVE参数是做什么用的呢?能够删除无效连接的最大功臣就是他了。当TCPKEEPALIVE参数设置为TRUE后,数据库会根据 SDE服务所在机器的注册表项KEEPALIVETIME所提供的响应时间,不断侦测所有连接是否为无效连接,如果为无效连接,则自动删除该连接。对默认安装操作系统的机器而言KEEPALIVETIME注册表项是没有的。 如果没有话,服务器不会主动发送 KeepAlive 数据包来确认空闲连接是否依然毫无变化。也就不会进行删除操作。所以上面提到的无效连接会越来越多。可以在如下路径中:Local_Machine\system\CurrentControlSet\ Services\Tcpip\Parameters 添加DWORD项:KeepAliveTime。如果不设置值的话默认为两小时。keepalivetime时间值是:SDE服务器giomgr进程在没有收到客户端的反应的最大阀值,如果超出该值,那么客户端进程和与其关联信息将被清除。它是在SDE服务器机器上的。 KeepAliveTime默认值是7200000ms( 2 hours),单位是毫秒。具体时间可以看情况而定。一般推荐为5分钟。然后重启机器(一定要重启,注册表的新加项才生效)。世界从此清静了,以后超出最大连接数的错误再也不会烦扰你的头皮。
为什么windows操作系统中sde服务的最大连接数为48个,原来是Windows为每个服务分配了一个固定大小的内存(默认512K)。每个sde进程大约需要9K内存,因此sde默认的连接数为512/9约等于48。可以修改这个内存数,将512k改为1024,如果连接数超过250,可以改成2048。需要修改注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows 项目中的SharedSection,并将原SharedSection=1024,3072,512中的第三项改为1024或2048等数即可修改系统的默认最大连接数
注意:sde直连应用的情况下TCPKEEPALIVE参数不起作用。
4.8.3.2:oracle最大连接数超限(在新建oracle数据库更改连接数就不用在此利用此方法进行如此繁琐的更改了)
解决办法如下:
A: 用ssh软件登陆服务器以sys身份登陆SQLplus
B: 查询目前连接数
查询连接用户:
select count(*) from v$session;
查询列表如下:
COUNT(*)
----------
45
查询当前连接进程数
show parameter processes;
查询列表如下:
NAME TYPE VALUE
------------------------------------ ----------- ----------------------
aq_tm_processes integer 0
db_writer_processes integer 1
gcs_server_processes integer 0
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 50
查询当前连接用户数
show parameter sessions
查询列表如下:
NAME TYPE VALUE
------------------------------------ ----------- ----------------------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
logmnr_max_persistent_sessions integer 1
sessions integer 60
shared_server_sessions integer
C: 更改系统连接数
alter system set processes=1000 scope=spfile;(更改进程数)
alter system set sessions = 1700 scope=spfile;(更改用户数)
更改后查询
select value from v$parameter where name='processes' or name='sessions'
D: 查询Oracle会话的方法
select * from v$session
注:ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下: sessions=(1.1*process+5)
重启数据库,使更改生效
查询那些应用的连接数此时是多少
select b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE , b.PROGRAM order by count(*) desc;
查询是否有死锁
select * from v$locked_object;
如果查询结果为no rows selected,说明数据库中没有死锁。否则说明数据库中存在死锁
会话的状态:
1.active 处于此状态的会话,表示正在执行,处于活动状态。
2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;
3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。我一开始以为,只要是inactive状态的会话,就是该杀,为什么不释放呢。其实,inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在oracle中直接设置超时时间,也是有两种方法,区别暂时还不清楚:
修改sqlnet.ora文件,新增expire_time=x(单位是分钟)
我的sqlnet.ora位置在D:\oracle\ora92\network\admin
sqlnet.expire_time = xx 的意思是如果 xx秒没有连接上数据库就会通知你连接超时,而不是自动断开超时连接。
2.通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。