【问题标题】:Database Connection Timeout Tomcat7数据库连接超时Tomcat7
【发布时间】:2015-07-17 09:17:29
【问题描述】:

在哪里可以设置获取数据库连接的超时时间: javax.sql.DataSource.getConnection() 在 tomcat 7 应用服务器中?

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup(DBManagerConstants.CONTEXT_NAME);
DataSource ds = (DataSource) envContext.lookup(DBManagerConstants.DS_NAME);
conn = ds.getConnection();

我在 Tomcat 7 上有 Java Web 应用程序,它连接到 Oracle 数据库。有一天,我们的网络管理员在此应用程序无法获得数据库连接后更改了防火墙中的某些内容,但仍然没有超时和错误。在防火墙应用程序中删除此更改后(1,5 小时后)继续工作,就好像什么都没发生一样。这些延迟的连接成功地完成了所有操作。

这是我的数据源

<Context>
     <Resource
        name="jdbc/pds"
        auth="Container"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="our.encryptor.EncryptedDataSourceFactory"
        logAbandoned="true"
        maxActive="30"
        maxIdle="10"
        maxWait="1000"
        password="my_password"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@127.0.0.1:8080:SID"
        username="my_user"
        accessToUnderlyingConnectionAllowed="true"
    validationQuery="select 1 from dual" />
</Context>

【问题讨论】:

  • 我认为问题在于 url 字符串 url="jdbc:oracle:thin:@127.0.0.1:8080:SID" 8080 是 Tomcat 默认端口。检查用于直接连接数据库的 tnsentry。
  • void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException from java.sql.Connection 可能有用

标签: java oracle tomcat jdbc connection


【解决方案1】:

您可以使用完全限定的连接 URL 并指定 CONNECT_TIMEOUT。 请注意,您可以在此连接 URL 中使用您的 SCAN IP 或服务名称。您不能使用 SID。

jdbc:oracle:thin:@(DESCRIPTION= (CONNECT_TIMEOUT=10)(RETRY_COUNT=3)
(ADDRESS_LIST= (LOAD_BALANCE=on)(FAILOVER=ON)
(ADDRESS=(PROTOCOL=tcp)(HOST=sales1-scan)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=sales2-scan)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME= salesservice.example.com)))

(2) OracleConnection.CONNECTION_PROPERTY_THIN_NET_CONNECT_TIMEOUT 中有一个属性,也可以用来设置这个属性。有关详细信息,请参阅 Javadoc。 http://docs.oracle.com/database/121/JAJDB/toc.htm

【讨论】:

  • 感谢您的信息。我认为第一个答案是我想要的,除了我根本无法让它工作 - 使用 CONNECT_TIMEOUT 甚至 TRANSPORT_CONNECT_TIMEOUT,当 Tomcat 启动时,连接仍然需要一分钟才能超时(但公平地说,我没有LOAD_BALANCE 和 FAILOVER 参数,因为我只有一个数据库所以只有一个地址)。
【解决方案2】:

连接不是持久的物理链接

我认为您和其他一些评论者可能遇到的一些困惑是,当客户端终止与数据库的连接时,数据库不知道该连接已消失,因为它不是像名字会暗示。 “数据库连接”更像是数据库愿意接受和发送数据包的外部 IP 地址的标识符。 “连接”只是意味着服务器知道客户端并正在等待数据,但如果客户端崩溃或消失,服务器不知道。因此,必须不时手动清除数据库上的陈旧连接。

如果客户端尝试连接您的数据库,则会创建一个新连接。现在,如果该客户端消失,则连接仍在数据库上,因为客户端脱机不会发送“终止连接”或类似的任何内容。现在,如果您设置防火墙或类似的东西,连接将保持有效。唯一会发生错误的情况是客户端在防火墙启动时返回并尝试说话,但如果您关闭防火墙并且客户端在 9 小时后返回,只要数据库没有破坏连接并且客户端也没有,然后一切都会从它停止的地方继续,“好像什么都没发生一样”引用 OP。

您可以通过在本地运行数据库并尝试连接到它来测试这一点。查看连接控制台,您会看到自己。终止您用来连接数据库的任何客户端并检查管理控制台,您将看到数据库仍在等待,即使您的客户端不存在。数据库会自行清除这些连接。

连接池

连接池允许您的应用重复使用相同的连接来完成它需要完成的工作,但如果您很长时间没有与数据库通信,通过您的应用,连接可能会过时并被数据库和因此,如果您尝试检索过时的连接,连接池具有配置参数。

validationQuery 字段下方的 OP 连接池参数会定期在您的应用上运行,以定期检查池内的连接是否仍然有效。这一切都是因为“连接”不是物理意义上的连接。

<Context>
     <Resource
        name="jdbc/pds"
        auth="Container"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="our.encryptor.EncryptedDataSourceFactory"
        logAbandoned="true"
        maxActive="30"
        maxIdle="10"
        maxWait="1000"
        password="my_password"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@127.0.0.1:8080:SID"
        username="my_user"
        accessToUnderlyingConnectionAllowed="true"
    validationQuery="select 1 from dual" />
</Context>

【讨论】:

  • 如果池中的每个连接都在使用中,maxWait 属性是否控制池等待连接可用的时间?这与单个连接等待其套接字连接多长时间无关,是吗?
  • @JerryJeremiah 这是正确的。它是从池中获取连接的时间。从最初的问题“我在哪里可以设置获取数据库连接的超时时间”和列出他们的数据库池参数的用户让我假设这就是他们想要的。
  • 我并没有质疑您答案的有效性 - 我只是想理解,因为我遇到了与 OP 相同的问题...
  • @JerryJeremiah 你能描述一下什么不适合你吗?您是否像 OP 一样试图理解为什么 1.5 小时后旧连接仍然良好?
  • 嗯,不是 1.5 小时,但是是的,有点。连接在无法通信时保持活动状态,而我在最后一天左右用来解决该问题的解决方案是将 oracle.jdbc.ReadTimeout 添加到 connectionProperties 属性,以便它们在几秒钟后放弃。 docs.oracle.com/cd/E57185_01/ESTUG/apbs02s23.html 说默认值为 600000 毫秒,所以我有点困惑,因为 OP 的连接不应该保持连接 1.5 小时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多