JDBC getConnection超时问题

时间:2009-06-03 15:09:03

标签: java jdbc java-ee

我有一个使用连接池从Oracle9i版本9.2.0.4数据库获取数据库连接的应用程序。应用程序托管在SJSAS 8.1中,驱动程序为ojdbc14.jar版本10.1.0.4。

我遇到的问题是datasource.getConnection()方法需要大约40秒才能在数据库关闭时抛出异常!这导致应用程序在数据库中断期间过载。我尝试使用数据源设置LoginTimeout=8,但它没有效果。

请参阅下面我正在使用的数据源

<jdbc-connection-pool connection-validation-method="table" 
                      datasource-classname="oracle.jdbc.pool.OracleDataSource" 
                      fail-all-connections="true" 
                      idle-time out-in-seconds="600" 
                      is-connection-validation-required="true" 
                      is-isolation-level-guaranteed="false" 
                      max-pool-size="100" 
                      max-wait-time-in-millis="8000" 
                      name="mydb" 
                      pool-resize-quantity="80" 
                      res-type="javax.sql.DataSource" 
                      steady-pool-size="20" 
                      validation-table-name="dual">
    <property name="url" value="jdbc:oracle:thin:@server1:1521:mydb"/>
    <property name="user" value="user1"/>
    <property name="LoginTimeout" value="8"/>
    <property name="password" value="pass1"/>
</jdbc-connection-pool>

任何人都可以帮忙吗?我需要getConnection()方法在给定的超时时间内超时。

1 个答案:

答案 0 :(得分:0)

以下是一些尝试:

来自“Oracle®DatabaseJDBC Developer's Guide and Reference”。

将JDBC与防火墙一起使用

空闲连接的防火墙超时可能会切断连接。这可能导致JDBC应用程序在等待连接时挂起。您可以执行以下一个或多个操作,以避免因防火墙超时而导致连接被切断:

  • 如果您正在使用连接缓存 或连接池,然后总是 设置不活动超时值 连接缓存要更短 比防火墙空闲超时值。
  • oracle.net.READ_TIMEOUT传递给 连接属性以启用读取 套接字超时。超时值 是以毫秒为单位。
  • 对于JDBC OCI和JDBC Thin 驱动程序,使用net描述符 连接到数据库并指定 中的ENABLE = BROKEN参数 连接中的DESCRIPTION子句 描述。另外,设置较低的值 tcp_keepalive_interval
  • 通过设置启用Oracle Net DCD SQLNET.EXPIRE_TIME=1在 服务器端的sqlnet.ora文件。