Тайм-аут подключения для DriverManager getConnection
Я пытаюсь подключиться к БД, используя стандартный способ JDBC
connection = DriverManager.getConnection(url, username, password);
Максимальное значение таймаута в соединении, как долго работает соединение, можно увеличить значение. Я хочу, чтобы в случаях, когда соединение было открытым навсегда, это хорошая идея.
Ответы
Ответ 1
Значение обычно контролируется DB. У вас нет контроля над ним с помощью кода. Это зависит от используемого сервера БД. Обычно это около 30 минут до одного часа.
С другой стороны, сохранение Connection
открытого навсегда - очень плохая идея. Лучшей практикой является получение и закрытых Connection
, Statement
и ResultSet
в кратчайшей возможной области действия, чтобы избежать утечек ресурсов и возможных сбоев приложений, вызванных утечками и таймауты.
Правда, подключение БД - дорогостоящая задача. Если ваше приложение должно работать довольно долго и достаточно быстро подключать БД, тогда рассмотрите возможность использования пула соединений для повышения производительности соединения. Если ваше приложение является веб-приложением, а затем загляните в документацию по приложениям, он обычно предоставляет средство объединения пулов в стиле DataSource
. Если это клиентское приложение, посмотрите на сторонние библиотеки объединения пулов, которые доказали свою надежность с годами, например Apache Commons DBCP (обычно используется, используется в многосерверных серверах), C3P0 (известный из Hibernate) и Proxool (если вы хотите подключения XA).
Имейте в виду, что при использовании пула соединений вам все равно нужно написать правильный код JDBC, т. к. приобретите и, чтобы закрыть все ресурсы в кратчайшей возможной области. Пул соединений в свою очередь будет беспокоиться о фактическом закрытии соединения или просто отпустить его обратно в пул для дальнейшего повторного использования.
Вы можете получить более подробную информацию из этой статьи, как правильно использовать основы JDBC.
Надеюсь, что это поможет и счастливое кодирование.
Ответ 2
Вы можете установить Тайм-аут в DriverManager следующим образом:
DriverManager.setLoginTimeout(10);
Connection c = DriverManager.getConnection(url, username, password);
Что означало бы, что если соединение не может быть открыто в течение заданного времени, время истекает.
С точки зрения поддержания открытого соединения навсегда, это возможно, если вы не закрываете соединение, но это может быть не очень хорошая идея. Соединения должны быть закрыты, как только вы закончите с ними.
Если вы хотите оптимизировать открытие и закрытие соединений, вы можете использовать пул соединений.
Ответ 3
Вот как это сделать с помощью драйвера Connector/J MYSQL:
String qqq = "jdbc:mysql://localhost/Test?connectTimeout=TIME_IN_MILLIS";
conn = DriverManager.getConnection(qqq, db_user, db_pass);
Это сработало для меня после того, как setLoginTimeout()
ничего не сделал.
Ответ 4
Просто повторить более полную отправку комментария от пользователя 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 - вы можете сделать это довольно просто, создав опцию" Свойства объекта ", затем prop.put(" connectTimeout "," 2000 ") (где" 2000 "- это тайм-аут в мс), а затем передайте свою опору объект к методу DriverManager.getConnection() вместе с вашим URL-адресом"
Ответ 5
Вы можете использовать интерфейс ExecutorService с Java. Ниже приведен пример того, что вам нужно сделать.
Future<Boolean> future = executor.submit(YOUR_METHOD);
future.get(TIMEOUT_YOU_NEED, TimeUnit.SECONDS);
Ответ 6
Как было предложено 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!");
}