是啊,数据库怎么能随便重起呢!!
我想找的是配置解决方法
我看每个会话都是INACTIVE状态的。我想知道当配置成共享服务器类型后,是否同一个客户端的连接下次是否会再次被利用,我看很多链接的上次活动活动时间都是好几天以前的,肯定是死链接了。我不能总是手动去中断他吧。我之所以提出这个问题的原因就是:每个会话会占用10Mb左右的SGA,如果总是不释放的话,大概过一个月左右我的客户端就会出现以下错误:
ORA-04030:  out  of  process  memory  when  trying  to  allocate  8192  bytes  (sort  subheap,sort  key)  
所以断定是我得客户会话连接没有在oracle里释放的原因。我看书说设置成共享服务器后会在池子里释放的啊??

解决方案 »

  1.   

    如果是这样,我想可能是你的异常中断太多
    oracle默认是不检查异常中断的。
    你判断session的INACTIVE状态是不行的,session在不执行sql的时候都是INACTIVE状态
    给你两种解决办法
    1、用profile文件
    先设置参数resource_limit = true
    然后新建立一个profile,设置idle_time = 60 (这里是分钟,可以自己设定)
    把你需要检查的用户设置到这个配置文件,那么,任何超过60分钟的空闲会话都将被pmon中断
    2、利用服务器的sqlnet.ora文件
    增加sqlnet.expire_time = 10 (这里也是分钟,可以自己设定)
    表示服务器每10分钟就会检查一下连接状况(发送一个数据包),如果发现该客户端不存在或连接不上,则会中断该连接
    ------------------------------------
    注意以上两种方法的区别,可以联合使用
      

  2.   

    penitent(只取一瓢) 有道理啊,我看了oracle的sqlnet.ora的sample在最下面是有关于sqlnet.expire_time 的设置,以前没有注意。他的默认值居然是0!
    我回头改一下试试,看看效果。
    不过还有个疑问:
    你说得第一种方法profile文件,我对这个不是很熟悉,怎样把需要检查的用户设置到这个配置文件?我可不可以只用sqlnet.ora的方法?
      

  3.   

    penitent(只取一瓢) 
    能看看你配置的一个sqlnet.ora的实例文件内容吗?
    学习一下,谢谢!
      

  4.   

    你也可以设置tcp参数,keepalivetime,windows下在HKEY_LOCAL_MACHINE 
    \SYSTEM 
    \CurrentControlSet 
    \Services: 
    \Tcpip 
    \Parameters KeepAliveTime  项: Tcpip\Parameters  数值类型:REG_DWORD - 时间(毫秒)  有效范围: 1-0xFFFFFFFF  默认值: 7,200,000(2 小时)  说明: 该参数可确定 TCP 每隔多长时间发送保留的数据包,来验证一次闲置连接 
    仍未断开。如果远程系统仍然可以连接并正在运行,它就会确认保留传输。默认情 
    况下,不发送保留数据包。应用程序可以在连接上启用这一功能。  
      

  5.   

    wanghai(汪海) ,
       我的数据库服务器不是win,是IBM AIX,所以你说的那种改注册表方法不行的。
      

  6.   

    wanghai(汪海) ,
        你说得这种情况是值得判断物理连接吧。但是有时同一台客户机(不关机)会出现多个会话(同一个程序多次)。
      

  7.   

    IBM AIX也有keepalivetime参数的,我印象中只有HP-UX没有
      

  8.   

    penitent(只取一瓢) 
    我试过了,那个加sqlnet.expire_time的办法没有用。会话连接照样还是没有释放。
    奇怪每个Inactive会话的当前SQL居然有内容,可是明明是好几个小时前的执行内容啊。
    我在OEM里面用“事务处理后中断”他,发现只是此会话的状态变为Killed。说明此会话的事务还没处理完,等于说此会话并没有执行完。我必须用“立即中断”,才能使此会话结束。
    到底使怎么回事呢?
    还有那个sqlnet.ora是放在数据库服务器上起作用,还是放在oracle客户端起作用呢?
      

  9.   

    Time Out Value  
     SQLNET.EXPIRE_TIME  
     This option can only be used on the server. Net8 sends a probe periodically to verify that a client-server connection is still active. This is done to ensure that connections are not left open indefinitely, due to an abnormal client termination. If the probe finds a dead connection, or a connection that is no longer in use, it returns an error, causing the server process to exit. Limitations on using the dead connection detection feature are as follows: Dead connection detection is not allowed on bequeathed connections. Though very small, a probe packet generates additional traffic that may downgrade network performance. The server may need to perform additional processing to distinguish the connection probing event from other events that occur, depending on which operating system is in use. This may also result in downgrading network performance.
      

  10.   

    看见没有
    Dead connection detection is not allowed on bequeathed connections. 
    可能你是用的专用服务器(还不是redirect connect方式的)
    那你用idle_time吧
    配置用户配置文件(profile)即可
      

  11.   

    我的数据库肯定用的是共享服务器类型。
    你说的profile文件怎样使用?我对UNIX不是很熟悉。是那个.profile吗?在里面添加idle_time=10 这个文件是配置环境变量的,把idle_time作为环境变量?好像没有这个环境变量。
    对了,我在改sqlnet.ora时候,没有把resource_limit = true设置,这个到底跟那部分有关,oracle文档也不是说得很详细。
      

  12.   

    resource_limit = true是设置profile起效的
    profile不是一个文件,是存在数据库中的
    在安全管理下面有,是用户配置文件,每个用户建立的时候,都会指定一个配置文件,默认的配置文件是default
    你可以建立一个新的配置文件
      

  13.   

    我看过Oracle文档,说
    resource_limit = true已经在9i里面是废弃的参数。
    如果改oracle配置文件的话,是没有idle_time这个参数的。
    你说的可能是unix用户的配置文件吧。
      

  14.   

    9i???
    resource_limit = true不是太清楚,那你查一查相关资料吧
      

  15.   

    怎么我看到的文档不一致?查了另一份在线Oracle9.2文档,没有提到是否废弃。明明看到说obsoleted=true
      

  16.   

    我试过了profile和resource_limit = true,发现我正常用的链接会在允许链接时间和空闲链接时间超过后会警告已经关闭,这并不是我想看到的。我只是想关闭那些死session和异常中断的session。不能总是手动去kill它吧。再说kill掉后只是他的状态变为killed,还是存在于会话列表中啊!
    看来不能单单加大允许连接时间和空闲时间来解决会话超时问题,想希望得到oracle能检测会话异常中断和无效的会话。然后关掉它,oracle不可能没有这个设置?
      

  17.   

    那oracle说明的有这个功能的就只有
    SQLNET.EXPIRE_TIME 
    但是,你不说你那里不可以吗?你可以查查9i相应文档,我这里只有8i的
      

  18.   

    我发现Windows版的Oracle似乎对释放会话很有效,同样的程序不会出现会话残留的现象,我那刚在普通PC上(128MB内存)装的windows版的Oracle用的还都是默认设置,专用服务器,连SGA都用默认。
    AIX上的Oracle从刚装完一开始就有这个问题。希望版主能继续关注本帖
      

  19.   

    (con=1000)(sess=1500)有你设置这么大的么?
    这是表示保留 1000个connections?  1500个sessions ?
    如果是这样太夸张了吧,既然是共享,有几十个就很多了啊这样又怎么会释放呢?
      

  20.   

    居然是这个意思?!!那么假如当连接和会话超过以上的数量,那么Oracle是否就会去将以前Inactive的连接彻底删除?还是另起一个dispatchers?是否需要设置dispatchers=2?
    盼回复!
      

  21.   

    没有释放,而且sql语句还有内容,我想是不是程序的问题,链接数据库后没有关闭?你根据提供的sql语句到程序中看看,是不是程序的错误,注意啊,有可能是很多session都是由一个程序文件引起的!
      

  22.   

    用了penitent(只取一瓢) 所说的第一种方法。
    将resource_limit设为true,新建一配置文件,设置空闲时间为1分钟,这样的话每当会话空闲操作1分钟,会话的状态就变成SINPED,还是占用一个系统会话。如果已经达到系统最大会话数又有新会话请求的话,系统仍然无法运行。能不能将会话彻底从会话树中删除呢,而不是仅仅将状态变成SINPED而已?
    to baggio785(狗狗)
    我目前的系统是一个网络系统,可能同时有很多用户使用同一程序,这样的话是否是使用同一会话,还是分别创建会话呢?
      

  23.   

    我是用ADO连数据库的,先Set Conn = CreateObject("ADODB.Connection")然后
    Conn.Open,程序运行完后,conn.execute("commit")  conn.close Set conn = nothing 
    ,可是程序运行一次就多一个会话,根本就没有断开,而且会话的状态是INACTIVE,还保留有上次执行的SQL代码,该怎么把它断开?
      

  24.   

    我是用ASP.NET连接Oracle。我也是觉得会话太多,同一个数据库用户,每执行一条SQL语句获取执行一个存储过程都会产生一个Session,为什么同一个用户不能继承它原来的Session而要新开辟一个Session.而且,有些Session一放就是几天,甚至有一个月的,太夸张了。我的系统会有可能40-50个数据库同时访问数据库。如果联机的数据库用户达到50个,我担心系统会支持不住。不知道哪位用ASP.NET开发连接Oracle开发的同行,是如何处理的?
      

  25.   

    sql server也是这样的,你可以每执行一条语句就关闭数据库,查询的时候再打开