我可以在哪里设置获取数据库连接的超时时间: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并指定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
连接不是持久的物理链接
我认为您和其他评论者可能会感到困惑的是,当客户端终止与数据库的连接时,数据库不知道该连接已消失,因为该连接不是像名称那样的实际正在进行的物理链接暗示。 “数据库连接”更多是数据库愿意接受和向其发送数据包的外部IP地址的标识符。被“连接”只是意味着服务器知道客户端并且正在等待数据,但是如果客户端崩溃或消失,服务器将不知道。因此,在数据库上必须不时地手动清除陈旧的连接。
如果客户端尝试与您的数据库连接,则会创建一个新的连接。现在,如果该客户端消失,则连接仍将保留在数据库上,因为脱机的客户端不会发送“终止连接”或类似的操作。现在,如果您设置了防火墙或类似的工具,则连接将保持有效。唯一会发生错误的情况是,如果客户端在防火墙启动时返回并尝试讲话,但是如果您关闭防火墙并且客户端在9小时后返回,则只要DB没有破坏连接并且客户端也没有出现该错误,那么所有内容都会在中断处“仿佛什么也没打乱”地引用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>