Подтвердить что ты не робот

Тайм-аут подключения для DriverManager getConnection

Я пытаюсь подключиться к БД, используя стандартный способ JDBC

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

Максимальное значение таймаута в соединении, как долго работает соединение, можно увеличить значение. Я хочу, чтобы в случаях, когда соединение было открытым навсегда, это хорошая идея.

4b9b3361

Ответ 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!");
}