连接数据时报Failed to connect to database. Maximum number of conections to instance exceeded错误

造成此错误的原因分为两种情况:

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。

你可能感兴趣的:(Oracle,ArcGIS,sde)