我正在尝试使用标准JDBC方式连接到数据库
connection = DriverManager.getConnection(url, username, password);
连接上是否存在最大超时值,连接存在多长时间,是否可以增加该值。我希望在连接永远打开的情况下,这是一个好主意。
答案 0 :(得分:29)
您可以在DriverManager上设置Timeout,如下所示:
DriverManager.setLoginTimeout(10);
Connection c = DriverManager.getConnection(url, username, password);
这意味着如果连接无法在给定时间内打开超时。
就保持连接永久打开而言,如果您不关闭连接,但可能不是一个好主意。连接完成后应立即关闭。
如果要优化连接的打开和关闭,则可以使用连接池。
答案 1 :(得分:26)
该值通常由DB控制。您无法使用代码控制它。这取决于使用的DB服务器。通常是大约30分钟到一个小时。
另一方面,永远保持Connection
开放是一个非常糟糕的主意。最佳做法是在最短范围内获取和关闭Connection
,Statement
和ResultSet
,以避免资源泄漏和潜在的应用由泄漏和超时引起的崩溃。
是的,连接数据库是一项昂贵的任务。如果您的应用程序应该运行相对较长的时间并且经常连接数据库,那么请考虑使用连接池来提高连接性能。如果您的应用程序是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);