DriverManager getConnection的连接超时

kal*_*kal 23 java oracle database-connection jdbc

我正在尝试使用标准JDBC方式连接到DB

connection = DriverManager.getConnection(url, username, password);
Run Code Online (Sandbox Code Playgroud)

连接上是否存在最大超时值,连接存在多长时间,是否可以增加该值.我希望在连接永远打开的情况下,这是一个好主意.

Vin*_*nie 30

您可以在DriverManager上设置Timeout,如下所示:

 DriverManager.setLoginTimeout(10);
 Connection c = DriverManager.getConnection(url, username, password);
Run Code Online (Sandbox Code Playgroud)

这意味着如果连接无法在给定时间内打开超时.

在保持连接永久打开方面,如果您不关闭连接,但可能不是一个好主意.连接完成后应立即关闭.

如果要优化连接的打开和关闭,则可以使用连接池.

  • 嗯,IIRC这只设置了在DB返回连接之前DriverManager必须等待多长时间.它不会设置连接的超时.另请参阅:http://java.sun.com/javase/6/docs/api/java/sql/DriverManager.html#setLoginTimeout%28int%29 (4认同)
  • 但是,我必须承认(并且你可能也)这个问题的正确答案正如主题主题中的字面意思一样.但是主题信息中的实际问题结果却是不同的. (2认同)
  • 使用MySQL驱动程序,`DriverManger.setLoginTimeout(10)`对我不起作用.我认为唯一的方法是使用[threads](http://stackoverflow.com/questions/4850957/how-to-force-time-out-the-drivermanager-getconnection-method-call). (2认同)
  • 大声笑@你的线程 - 你可以很简单地通过创建一个属性对象`prop`,然后`prop.put("connectTimeout", "2000")`(其中“2000”是以毫秒为单位的超时),然后将你的 `prop` 对象和你的 url 一起传递给 `DriverManager.getConnection()` 方法 (2认同)

Bal*_*usC 26

该值通常由DB控制.您无法使用代码控制它.这取决于使用的DB服务器.通常大约30分钟到一个小时.

另一方面,Connection永远保持开放是一个非常糟糕的主意.最佳实践是获取关闭Connection,StatementResultSet在尽可能的范围内避免资源泄漏和由泄漏和超时引起的潜在应用程序崩溃.

没错,连接数据库是一项昂贵的任务.如果您的应用程序应该运行相对较长的时间并且经常连接数据库,那么请考虑使用连接池来提高连接性能.如果您的应用程序是Web应用程序,那么请查看appserver的文档,它通常提供一个连接池设施DataSource.如果它是一个客户端应用程序,那么寻找第三方连接池库,这些库已经证明了它们多年来的稳健性,例如Apache Commons DBCP(常用于批量应用服务器),C3P0(来自Hibernate)和Proxool(如果你想要的话) XA连接).

请记住,在使用连接池时,您仍然必须编写正确的JDBC代码,然后在尽可能短的范围内获取关闭所有资源.连接池将担心实际关闭连接或仅将其释放回池以供进一步重用.

您可以从本文中获得更多有关如何以正确方式执行JDBC基础知识的见解.

希望这有助于编码.

  • 好吧,当资源"昂贵"时你想要使用一个池(需要一些时间来创建).DBCP(或实际上是底层池)在生成新对象时对整个池保持锁定.这可以防止已经完成资源并且仅仅尝试将其返回到块的线程.同时,其他线程被阻止尝试获取这些资源.由于这些锁定获取不使用并发包,因此它们不可中断.这会在正常条件下伤害性能.如果某些内容实际上与数据库不一致,它会变得非常*丑陋,非常快. (6认同)
  • DBCP是一个可怕的,*可怕的*连接池.永远不要使用它. (3认同)
  • 是的,好点.对于Tomcat,最好用`org.apache.tomcat.jdbc.pool.DataSourceFactory`替换.谢谢你的抬头,+1. (3认同)

小智 7

以下是使用Connector/J MYSQL驱动程序的方法:

String qqq = "jdbc:mysql://localhost/Test?connectTimeout=TIME_IN_MILLIS";
conn = DriverManager.getConnection(qqq, db_user, db_pass);
Run Code Online (Sandbox Code Playgroud)

之后setLoginTimeout()无所事事,对我有用.

  • 这是错误的`connectTimeout = TIME_IN_MILLIS`,因为它是`connectTimeout = TIME_IN_SECONDS`更多信息http://dev.mysql.com/doc/refman/5.1/en/mysql-command-options.html#option_mysql_connect_timeout (4认同)

小智 7

只需从用户flamming_python中重新发布一个更完整的评论重新发布作为答案,因为它对我有用:

dbConnectionString = "jdbc:mysql://"+dbHost+":"+dbPort+"/"+dbTable+"?user="+dbUser+"&password="+dbPassword;
Properties properties = new Properties();
properties.put("connectTimeout", "2000");
dbConnect = DriverManager.getConnection(dbConnectionString, properties);
Run Code Online (Sandbox Code Playgroud)

原始评论:
"LoL @ your threads - 你可以通过创建一个Properties对象prop,然后prop.put("connectTimeout","2000")(其中"2000"是以ms为单位的超时)来完成它,然后将您的prop对象与您的url一起传递给DriverManager.getConnection()方法"