设置Oracle 11g会话超时

时间:2010-07-29 15:01:53

标签: oracle oracle11g

重启服务器后,Tomcat服务器的oracle连接每晚都会超时。在重新启动之前,连接没有超时。现在,在早上,应用程序在访问数据库时会抛出JDBC连接错误。重新启动Tomcat可以解决问题。我假设这是由于重新建立连接。我认为,这是由于Oracle数据库超时会话。如何在Oracle 11g中禁用会话超时?
谢谢!
史蒂夫

Config.groovy,dev和test省略。

dataSource {
  pooled = true
}

hibernate {
   cache.use_second_level_cache = true
   cache.use_query_cache = true
   cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

// environment specific settings
environments {
production {
  dataSource {
    driverClassName = "oracle.jdbc.driver.OracleDriver"
    username = "XXXXX"
    password = "XXXXXX"
    dialect = "org.hibernate.dialect.Oracle10gDialect"
    dbCreate = "update" // one of 'create', 'create-drop','update'
    url = "jdbc:oracle:thin:@XXXXXX:1521:xxxx"
  }
}  }

6 个答案:

答案 0 :(得分:14)

这通常由与Tomcat连接的用户关联的配置文件控制。

SQL> SELECT PROFILE, LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME = 'IDLE_TIME';

PROFILE                        LIMIT
------------------------------ ----------------------------------------
DEFAULT                        UNLIMITED

SQL> SELECT PROFILE FROM DBA_USERS WHERE USERNAME = USER;

PROFILE
------------------------------
DEFAULT

所以我连接的用户有无限的空闲时间 - 没有超时。

答案 1 :(得分:3)

Adam已经建议了数据库配置文件。

您可以检查SQLNET.ORA文件。有一个EXPIRE_TIME参数,但这是用于检测丢失的连接,而不是终止现有的连接。

鉴于它是在一夜之间发生的,它听起来更像是一个空闲超时,可能是应用服务器和数据库服务器之间的防火墙。设置EXPIRE_TIME 可以停止发生这种情况(因为每10分钟会检查一次,以检查客户端是否存在)。

或者数据库可能正在关闭并重新启动,这会导致连接中断。

或者,您应该能够使用validationQuery配置tomcat,以便在没有重启tomcat的情况下自动重启连接

答案 2 :(得分:3)

这可能是由应用程序的连接池引起的;不是Oracle DBMS问题。大多数连接池都有一个validate语句,可以在为您提供连接之前执行。在oracle中你会想要“从双重中选择1”。

重新启动服务器后它开始出现的原因是连接池可能是在没有重新启动的情况下添加的,而您刚刚第一次遇到连接池的使用。处理数据库连接的资源文件的修改日期是什么?

验证查询示例:

 <Resource name="jdbc/EmployeeDB" auth="Container" 
            validationQuery="Select 1 from dual" type="javax.sql.DataSource" username="dbusername" password="dbpassword"
            driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database"
            maxActive="8" maxIdle="4"/>

修改 对于Grails,grails池有类似的配置选项。 Grails 1.2的示例(请参阅Grails 1.2的发行说明)

dataSource {
    pooled = true
    dbCreate = "update"
    url = "jdbc:mysql://localhost/yourDB"
    driverClassName = "com.mysql.jdbc.Driver"
    username = "yourUser"
    password = "yourPassword"
    properties {
        maxActive = 50
        maxIdle = 25
        minIdle = 5
        initialSize = 5
        minEvictableIdleTimeMillis = 60000
        timeBetweenEvictionRunsMillis = 60000
        maxWait = 10000     
    }   
}

答案 3 :(得分:2)

我遇到了这个问题,寻找一种基于总会话生存期而不是空闲时间来启用oracle会话池到期的方法。 另一个目标是避免意外关闭应用程序。

似乎可以通过将池validation query设置为

来实现
select 1 from V$SESSION 
where AUDSID = userenv('SESSIONID') and sysdate-LOGON_TIME < 30/24/60

这将以可预测的方式关闭30分钟以上的会话,这不会影响应用程序。

答案 4 :(得分:0)

数据库是否知道连接已断开,或者会话是否仍在v $ session中列出?我认为,这表明它正在被网络淘汰。你知道它在遇到问题之前可以保持多长时间,如果它与TCP空闲值有任何相似之处(如果我没记错的话,net.sipv4.tcp_keepalive_time,来自sysctl的tcp_keepalive_probes和tcp_keepalive_interval)?不记得默认情况下sysctl更改是否仍然存在,但这可能是已修改然后重新启动重置的内容。

您也可以在不弹跳整个服务器的情况下重置JDBC连接;当然可以在WebLogic中,我意识到这没什么用,但我不熟悉Tomcat的等价物。

答案 5 :(得分:0)

检查应用程序连接池设置,而不是更改oracle db上的任何会话timout设置。他们超时是正常的。

看看这里: http://grails.org/doc/1.0.x/guide/3.%20Configuration.html#3.3%20The%20DataSource

您确定已正确设置“池化”参数吗?

问候, 拉斯


修改
第一眼看来你的配置似乎没问题。 我今天遇到了这个问题。也许这与你的痛苦有关:
"Infinite loop of exceptions if the application is started when the database is down for maintenance"