gpt4 book ai didi

java - DriverManager.getConnection() 超时?

转载 作者:行者123 更新时间:2023-11-29 22:42:58 25 4
gpt4 key购买 nike

我正在使用 Java 和 mysql 作为数据库,但遇到了一个奇怪的问题:我的一位客户的连接非常不稳定,有时丢包率可能很高。好吧,我知道这不是软件的错误,但我去那里进行了测试,当程序调用“DriverManager.getConnection()”并且网络连接变得不稳定时,该行将应用程序(或给定线程)锁定几分钟。当然,我添加了一些逻辑来使用另一个数据源在本地缓存数据,然后在可能的情况下保存到网络主机,但是,我不能经常让程序挂起超过 10 秒(而且这种方法似乎没有任何效果)超时规范)。因此,我想出了这样的解决方法:

public class CFGBanco implements Serializable {
public String driver = "com.mysql.jdbc.Driver";
public String host;
public String url = "";
public String proto = "jdbc:mysql://";
public String database;
public String user;
public String password;
}

private static java.sql.Connection Connect(HostConfig dataHost) throws java.sql.SQLException, ClassNotFoundException
{
dataHost.url = dataHost.proto+dataHost.host;
if(dataHost.database != null && !dataHost.database.equals("")) dataHost.url += "/"+dataHost.database;
java.lang.Class.forName(dataHost.driver);
ArrayList<Object> lh = new ArrayList<>();
lh.add(0, null);
Thread ConThread = new Thread(()-> {
try {
lh.add(0, java.sql.DriverManager.getConnection(
dataHost.url, dataHost.user, dataHost.password));
} catch(Exception x ) {
System.out.println(x.getMessage());
}
}, "ConnThread-"+SessId);
ConThread.start();
Thread TimeoutThread = new Thread(() -> {
int c = 0;
int delay = 100;
try {
try {
do {
try {
if(t.isAlive())
Thread.sleep(delay);
else
break;
} catch(Exception x) {}
} while((c+=delay) < 10000);
} catch(Exception x){}
} finally {
try {
t.stop();
} catch(Exception x){}
}
}, "ConTimeout-"+SessId);
TimeoutThread.start();
try {
ConThread.join();
} catch(Exception x) {}
if(lh.get(0) == null)
throw new SQLException();
return (Connection) lh.get(0);
}

我从另一个线程调用 getConnection,然后创建一个辅助“超时”线程来监视它,然后将调用线程加入到 ConThread。事实上,我得到的结果接近预期,但这让我想知道:有一个更好的方法吗?创建 2 个线程是否会占用大量系统资源,足以使这种方法不切实际?

最佳答案

您需要连接池。池化连接并重用它,而不是每次都重新创建。用于数据库连接池的这样一个库是 DBCP by Apache

它会处理连接断开等问题。您可以进行验证查询,它会在从池中借用连接之前查询数据库,一旦验证成功,它将触发您的实际查询。

关于java - DriverManager.getConnection() 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29234164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com