Какой стандартный способ в jdbc управлять потерянным соединением? - PullRequest
1 голос
/ 25 января 2012

Мое приложение иногда может потерять соединение с базой данных MySQL.Я думаю, что хорошим решением будет назначить таймер, чтобы попытаться восстановить связь через некоторое время.Как лучше это сделать?Может быть отдельный поток, который пытается подключиться к БД?Или существуют стандартные практики?Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

JDBC - отличный способ начать создание приложения базы данных java, но управление отображениями объектов и соединениями / транзакциями может очень быстро привести к множеству проблем и переписыванию логики, которая уже была написана многими программистами много раз.

Ожидается, что вы должны потерять / закрыть соединение в обычном режиме, если только у вас нет приложения с высокой пропускной способностью, и в этом случае вы можете поддерживать несколько соединений живыми (это называется пулом соединений).

Существуют 3 подхода «высокого уровня» для поддержания эффективных соединений и транзакций:

1) Самое простое решение - это проверить, когда вы повторно используете соединение, чтобы убедиться, что оно допустимо, или открывать его каждый раз.

2) Более сложным решением является использование механизма пула соединений, такого как библиотека apache http://commons.apache.org/dbcp/ dbcp.

3) Наконец, на мой взгляд, наиболее приемлемым решением является использование JDBC-фреймворка, такого как ibatis / hibernate , который предоставит вам простой декларативный интерфейс для управления объектным реляционным отображением / транзакций / базой данных. состояние ---- при этом также прозрачно поддерживает логику подключения для вас.

ТАКЖЕ: Если реляционное сопоставление объектов не является вашей вещью, то вы можете использовать такую ​​инфраструктуру, как DBUtils от apache, для управления запросами и соединениями, не мешая при этом сложному отображению данных.

1 голос
/ 25 января 2012

JDBC - это простой API для абстрагирования операций различных систем баз данных.Это делает что-то единообразное, такие разные нативные типы для java-типов.

Однако потеря соединения - еще одна большая проблема.Использовать библиотеку пулов соединений лучше, чем писать новую самостоятельно.Слишком много деталей, чтобы реализовать пул соединений с нуля без ошибок.

Подумайте об использовании зрелой библиотеки:

  • Commons-DBCP
  • bonecp
  • и т. Д.

Commons DBCP основан на пуле Commons.Вы должны понимать настраиваемые параметры обоих.Bonecp - это еще один новый пул соединений, его преимущество не имеет никакой блокировки.

Проверенная строка SQL важна для проверки того, что соединение разорвано или активно.Разрешение проверки потерянного соединения с помощью набора строк проверки.

Вот страница конфигурации dbcp: http://commons.apache.org/dbcp/configuration.html

Там написано:

ПРИМЕЧАНИЕ - дляистинное значение, чтобы иметь какой-либо эффект, параметр validationQuery должен быть установлен в ненулевую строку.

Например:

    dataSource.setValidationQuery(isDBOracle() ? "select 1 from dual" : "select 1");
    dataSource.setTestWhileIdle(true);
    dataSource.setTestOnReturn(true);
    dataSource.setRemoveAbandoned(true);
    dataSource.setRemoveAbandonedTimeout(60 * 3 /* 3 mins */);

    dataSource.setMaxIdle(30);
    dataSource.setMaxWait(1000 * 20 /* 20 secs*/);

Напоминание: если вы используете Common DBCPв weblogic не забудьте старую библиотеку Commons на сервере, она заставит ваше приложение использовать другую версию.Вам поможет настройка предпочитаемое-веб-inf-классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...