是啊,数据库怎么能随便重起呢!!
我想找的是配置解决方法
我看每个会话都是INACTIVE状态的。我想知道当配置成共享服务器类型后,是否同一个客户端的连接下次是否会再次被利用,我看很多链接的上次活动活动时间都是好几天以前的,肯定是死链接了。我不能总是手动去中断他吧。我之所以提出这个问题的原因就是:每个会话会占用10Mb左右的SGA,如果总是不释放的话,大概过一个月左右我的客户端就会出现以下错误:
ORA-04030: out of process memory when trying to allocate 8192 bytes (sort subheap,sort key)
所以断定是我得客户会话连接没有在oracle里释放的原因。我看书说设置成共享服务器后会在池子里释放的啊??
我想找的是配置解决方法
我看每个会话都是INACTIVE状态的。我想知道当配置成共享服务器类型后,是否同一个客户端的连接下次是否会再次被利用,我看很多链接的上次活动活动时间都是好几天以前的,肯定是死链接了。我不能总是手动去中断他吧。我之所以提出这个问题的原因就是:每个会话会占用10Mb左右的SGA,如果总是不释放的话,大概过一个月左右我的客户端就会出现以下错误:
ORA-04030: out of process memory when trying to allocate 8192 bytes (sort subheap,sort key)
所以断定是我得客户会话连接没有在oracle里释放的原因。我看书说设置成共享服务器后会在池子里释放的啊??
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分钟就会检查一下连接状况(发送一个数据包),如果发现该客户端不存在或连接不上,则会中断该连接
------------------------------------
注意以上两种方法的区别,可以联合使用
我回头改一下试试,看看效果。
不过还有个疑问:
你说得第一种方法profile文件,我对这个不是很熟悉,怎样把需要检查的用户设置到这个配置文件?我可不可以只用sqlnet.ora的方法?
能看看你配置的一个sqlnet.ora的实例文件内容吗?
学习一下,谢谢!
\SYSTEM
\CurrentControlSet
\Services:
\Tcpip
\Parameters KeepAliveTime 项: Tcpip\Parameters 数值类型:REG_DWORD - 时间(毫秒) 有效范围: 1-0xFFFFFFFF 默认值: 7,200,000(2 小时) 说明: 该参数可确定 TCP 每隔多长时间发送保留的数据包,来验证一次闲置连接
仍未断开。如果远程系统仍然可以连接并正在运行,它就会确认保留传输。默认情
况下,不发送保留数据包。应用程序可以在连接上启用这一功能。
我的数据库服务器不是win,是IBM AIX,所以你说的那种改注册表方法不行的。
你说得这种情况是值得判断物理连接吧。但是有时同一台客户机(不关机)会出现多个会话(同一个程序多次)。
我试过了,那个加sqlnet.expire_time的办法没有用。会话连接照样还是没有释放。
奇怪每个Inactive会话的当前SQL居然有内容,可是明明是好几个小时前的执行内容啊。
我在OEM里面用“事务处理后中断”他,发现只是此会话的状态变为Killed。说明此会话的事务还没处理完,等于说此会话并没有执行完。我必须用“立即中断”,才能使此会话结束。
到底使怎么回事呢?
还有那个sqlnet.ora是放在数据库服务器上起作用,还是放在oracle客户端起作用呢?
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.
Dead connection detection is not allowed on bequeathed connections.
可能你是用的专用服务器(还不是redirect connect方式的)
那你用idle_time吧
配置用户配置文件(profile)即可
你说的profile文件怎样使用?我对UNIX不是很熟悉。是那个.profile吗?在里面添加idle_time=10 这个文件是配置环境变量的,把idle_time作为环境变量?好像没有这个环境变量。
对了,我在改sqlnet.ora时候,没有把resource_limit = true设置,这个到底跟那部分有关,oracle文档也不是说得很详细。
profile不是一个文件,是存在数据库中的
在安全管理下面有,是用户配置文件,每个用户建立的时候,都会指定一个配置文件,默认的配置文件是default
你可以建立一个新的配置文件
resource_limit = true已经在9i里面是废弃的参数。
如果改oracle配置文件的话,是没有idle_time这个参数的。
你说的可能是unix用户的配置文件吧。
resource_limit = true不是太清楚,那你查一查相关资料吧
看来不能单单加大允许连接时间和空闲时间来解决会话超时问题,想希望得到oracle能检测会话异常中断和无效的会话。然后关掉它,oracle不可能没有这个设置?
SQLNET.EXPIRE_TIME
但是,你不说你那里不可以吗?你可以查查9i相应文档,我这里只有8i的
AIX上的Oracle从刚装完一开始就有这个问题。希望版主能继续关注本帖
这是表示保留 1000个connections? 1500个sessions ?
如果是这样太夸张了吧,既然是共享,有几十个就很多了啊这样又怎么会释放呢?
盼回复!
将resource_limit设为true,新建一配置文件,设置空闲时间为1分钟,这样的话每当会话空闲操作1分钟,会话的状态就变成SINPED,还是占用一个系统会话。如果已经达到系统最大会话数又有新会话请求的话,系统仍然无法运行。能不能将会话彻底从会话树中删除呢,而不是仅仅将状态变成SINPED而已?
to baggio785(狗狗)
我目前的系统是一个网络系统,可能同时有很多用户使用同一程序,这样的话是否是使用同一会话,还是分别创建会话呢?
Conn.Open,程序运行完后,conn.execute("commit") conn.close Set conn = nothing
,可是程序运行一次就多一个会话,根本就没有断开,而且会话的状态是INACTIVE,还保留有上次执行的SQL代码,该怎么把它断开?