DriverManager getConnection的连接超时

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

connection = DriverManager.getConnection(url, username, password); 

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

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

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

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

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

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

希望这有助于编码。

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

  DriverManager.setLoginTimeout(10); Connection c = DriverManager.getConnection(url, username, password); 

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

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

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

只需从用户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); 

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

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

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

setLoginTimeout()什么也没做之后, setLoginTimeout()setLoginTimeout()

正如bestro建议的那样,可以使用具有相关超时的未来。 例如:

 ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(new Callable() { @Override public Connection call() throws Exception { Connection con = DriverManager.getConnection(url, username, password); return con; } }); Connection con = null; try { con = future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException ex) { Logger.getLogger(Scratch.class.getName()).log(Level.SEVERE, null, ex); } executor.shutdownNow(); if (con == null) { System.out.println("Could not establish connection"); } else { System.out.println("Connection established!"); } 

您可以使用Java中的ExecutorService接口。 以下是您需要做的事情的示例。

 Future future = executor.submit(YOUR_METHOD); future.get(TIMEOUT_YOU_NEED, TimeUnit.SECONDS);