Мое приложение иногда может потерять соединение с базой данных MySQL. Я думаю, что хорошим решением будет запланировать некоторый таймер, чтобы попытаться восстановить соединение через некоторое время. Как лучше это можно сделать? Может быть отдельный поток, который пытается подключиться к БД? Или существуют стандартные практики? Спасибо.
Какой стандартный способ в jdbc управлять потерянным соединением?
Ответы (2)
JDBC - отличный способ начать создание приложения базы данных Java, но управление сопоставлениями объектов и соединениями / транзакциями может очень быстро привести к большому количеству шаблонов и переписыванию логики, которая уже была написана много раз многими программистами.
Ожидается, что вы должны нормально терять/закрывать соединение, если только у вас нет приложения с высокой пропускной способностью, и в этом случае вы можете поддерживать несколько активных соединений (это называется пулом соединений).
Существует 3 подхода "высокого уровня" к поддержанию эффективных подключений и транзакций:
1) Самое простое решение - проверять, когда вы повторно используете соединение, чтобы убедиться, что оно действительно, или каждый раз открывать его заново.
2) Более сложное решение — использовать механизм объединения соединений, такой как apache http://commons.apache.org/dbcp/ библиотека dbcp.
3) Наконец, на мой взгляд, наиболее удобным решением является использование среды JDBC, такой как ibatis/hibernate, которая предоставит вам простой декларативный интерфейс для управления реляционным сопоставлением объектов / транзакциями / состоянием базы данных - --- при этом также прозрачно поддерживая логику подключения для вас.
ТАКЖЕ: Если вам не нравится реляционное сопоставление объектов, вы можете использовать инфраструктуру, такую как DBUtils от apache, для управления запросами и соединениями, не мешая тяжелому материалу сопоставления данных.
JDBC — это простой API для абстрагирования операций различных систем баз данных. Это делает что-то единообразным, такие разные нативные типы для типа java.
Однако потеря связи — еще одна большая проблема. Лучше использовать библиотеку пула соединений, чем писать новую самостоятельно. Слишком много деталей, чтобы реализовать пул соединений с нуля без ошибок.
Рассмотрите возможность использования зрелой библиотеки:
- Commons-DBCP
- кость
- и т.д
Commons DBCP основан на Commons Pool. Вы должны понимать настраиваемые параметры обоих из них. 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 на сервере, она заставит ваше приложение использовать другую версию. Вам поможет настройка Prefer-web-inf-classes.