DriverManager getConnection的连接超时

时间:2009-11-05 22:03:09

标签: java oracle jdbc database-connection

我正在尝试使用标准JDBC方式连接到数据库

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

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

6 个答案:

答案 0 :(得分:29)

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

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

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

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

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

答案 1 :(得分:26)

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

另一方面,永远保持Connection开放是一个非常糟糕的主意。最佳做法是在最短范围内获取关闭ConnectionStatementResultSet,以避免资源泄漏和潜在的应用由泄漏和超时引起的崩溃。

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

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

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

希望这有助于编码。

答案 2 :(得分: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);

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

答案 3 :(得分:6)

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

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

setLoginTimeout()没有做任何事情后,它对我有用。

答案 4 :(得分:0)

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

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Connection> future = executor.submit(new Callable<Connection>() {

    @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!");
}

答案 5 :(得分:-1)

您可以使用Java中的ExecutorService接口。以下是您需要做的样本。

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