Я просто хотел бы иметь возможность определить, открыто ли соединение между Hibernate и моей базой данных (MS SQL Server). Например, я хотел бы иметь возможность обнаружить это, зарегистрировать его и попробовать снова подключиться через 60 секунд.
Вы действительно можете использовать getDelegate()
, чтобы получить базовый объект провайдера для EntityManager и затем получить доступ к базовому JDBC Connection
. Но внимательно прочитайте Javadoc:
Возвращает базовый объект провайдера для EntityManager, если он доступен. Результат этого метода зависит от реализации.
Это делает ваш код вдвойне непереносимым. Сначала он связывает вас с базовой реализацией (здесь Hibernate Session
). Во-вторых, вы не всегда можете получить один и тот же результат (по крайней мере, не в контейнере Java EE).
Действительно, вы не хотите этого, поскольку это полностью побеждает точку JPA. Кроме того, вы не хотите самостоятельно выполнять эту проверку соединения низкого уровня.
Нет, вместо этого вы должны использовать (автономный) пул соединений , который позаботится об этом за вас. c3p0 является одним из них, и его можно настроить для проверки соединения и ведения журнала . Использование пула соединений означает меньшее количество кода, лучшую надежность, лучшие возможности восстановления, лучшие проверки без потери переносимости. Это похоже на беспроигрышную ситуацию для меня.