2010-07-29 114 views
8

重新启动服务器后,Tomcat服务器的oracle连接每晚超时。在重新启动之前,连接没有超时。现在,早上应用程序抛出访问数据库的JDBC连接错误。重新启动Tomcat可以解决问题。我假设这是由于连接重新建立。我认为这是由于Oracle数据库超时。如何在Oracle 11g中禁用会话超时?
谢谢!
Steve设置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" 
    } 
} } 
+1

这是一个在tomcat上运行的grails应用程序吗? – 2010-08-06 16:24:06

+0

yes - Grails 1.2.2,RHEL 5.5,Tomcat 6.0.26 – ptsw 2010-08-09 13:07:34

回答

12

这通常由与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 

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

+0

Adam,感谢您的建议!一切都按照用户的顺序排列,但不幸的是,这个连接在一夜之间掉线了。哎呀!任何其他想法?很明显,我不是DBA老兄,但是让我感到困惑的是,直到重新启动服务器才发生这种情况。我想知道如果我确实运行了一个命令,允许连接保持无限期并且不会持久,并且服务器重新启动设置时丢失了。 – ptsw 2010-07-30 14:33:17

0

数据库知道连接已经丢失,还是会话仍然在v $ session中列出?这意味着,我认为,它正在被网络抛弃。你知道在遇到问题之前它可以保持空闲多久,并且如果它与TCP空闲值(如果我正确记得的话,它们与sysctl中的net.ipv4.tcp_keepalive_time,tcp_keepalive_probes和tcp_keepalive_interval)有任何相似之处?不记得默认情况下sysctl更改是否持久,但这可能是已修改的,然后通过重新启动重置。

此外,您也许可以在不弹回整个服务器的情况下重置JDBC连接;当然可以在WebLogic中使用,我认为这并没有多大帮助,但我不熟悉Tomcat的等价物。

+0

Alex,我只看到LOGON_TIME> last tomcat restart的会话。如果网络超时,那么无论tomcat重启,这些会话都应该在表中。对? sysctl的信息: net.ipv4.tcp_keepalive_intvl = 75个 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_time = 7200 – ptsw 2010-08-12 19:38:38

+0

是,Tomcat的重启不会影响到任何旧的孤儿会话。我猜Oracle可能会注意到他们在一段时间后终止并终止它们,完全独立于客户端关闭它的结束(仅当尝试发送数据时);我们有一个JDBC客户端应用程序,它的行为与远程数据库反弹后数小时相似,但我确信有很多变体。你需要在超时之后直接检查v $ session中的内容,但是因为这是不知道的,而且在某个时间过夜,所以这很难。我想监视v $会话,看看他们什么时候关闭?祝你好运... – 2010-08-12 22:15:18

2

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

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

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

或者可能数据库正在关闭并重新启动,并且正在终止连接。

另外,你应该能够有一个validationQuery配置Tomcat,以便它会自动重启没有tomcat的连接重启

+0

加里,sqlnet.ora文件并没有真正包含我的系统。它只有两个变量--NAMES.DIRECTORY_PATH和ADR_BASE。这对你来说看起来是否合适? - Steve – ptsw 2010-08-16 14:03:13

+0

听起来很正常。如果没有expire_time,Oracle通常不会注意到客户端连接是否被终止,除非它处于某种事情的中间。如果v $会话条目不在附近,这听起来像是被故意关闭的客户端应用程序。 – 2010-08-16 22:55:37

2

这由你的应用程序的连接池可能引起的;不是Oracle DBMS问题。大多数连接池都有一个验证语句,可以在给你连接之前执行。在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  
    } 
} 
+0

Brian,感谢您的建议,但我的应用程序使用grails进行数据库配置。我不认为tomcat配置文件起作用。对? - Steve – ptsw 2010-08-16 14:07:24

+0

在您的grails数据库配置中将池值设置为true或false?如果您没有参数设置,则默认值为true。如果合并设置为true,我敢打赌池是问题,而不是Oracle会话。 – 2010-08-16 17:46:04

0

检查应用程序的连接池设置,而不是在Oracle数据库更改任何会话timout设置。这是正常的,他们超时。

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

你确定你已经正确地设置了“合并”参数?

问候, 拉尔斯


编辑:
你的配置似乎在第一次看到OK。 今天我遇到了这个问题。也许这是关系到你的痛苦:
"Infinite loop of exceptions if the application is started when the database is down for maintenance"

+0

拉尔斯,谢谢你的建议。我将Config.groovy添加到了问题中。一切看起来都是为了我。有什么不对吗跳到你身上? - Steve – ptsw 2010-08-16 13:59:08

1

我来到这个问题寻找一种方式,以总会话生命周期,而不是空闲时间就使Oracle会话池到期。另一个目标是避免部队对应用程序意外关闭。

似乎有可能通过设置池validation query

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

这将关闭会话老化预测的方式不会影响应用程序超过30分钟。

+0

这里是类似的验证查询JBoss AS:http://stackoverflow.com/a/32844258/603516 – Vadzim 2015-10-01 06:09:22