Как обнаружить открытое соединение с базой данных с Hibernate / JPA? - PullRequest
1 голос
/ 21 января 2010

Я изучаю JPA с Hibernate, используя проект Java SE 6. Я просто хотел бы иметь возможность определить, открыто ли соединение между Hibernate и моей базой данных (MS SQL Server). Например, я хотел бы иметь возможность обнаружить это, зарегистрировать его и попробовать снова подключиться через 60 секунд.

Я думал, что это сработает, но isOpen() не то, что я хочу (всегда верно):

EntityManagerFactory emf = Persistence.createEntityManagerFactory("rcc", props);
if (emf != null && emf.isOpen()) {
    EntityManager em = emf.createEntityManager();
    if (em == null || !emf.isOpen())
        // error connecting to database
    else ...

Мне кажется, это простая проблема, но я не могу найти ответ!

Ответы [ 3 ]

4 голосов
/ 22 января 2010

Я просто хотел бы иметь возможность определить, открыто ли соединение между Hibernate и моей базой данных (MS SQL Server). Например, я хотел бы иметь возможность обнаружить это, зарегистрировать его и попробовать снова подключиться через 60 секунд.

Вы действительно можете использовать getDelegate(), чтобы получить базовый объект провайдера для EntityManager и затем получить доступ к базовому JDBC Connection. Но внимательно прочитайте Javadoc:

Возвращает базовый объект провайдера для EntityManager, если он доступен. Результат этого метода зависит от реализации.

Это делает ваш код вдвойне непереносимым. Сначала он связывает вас с базовой реализацией (здесь Hibernate Session). Во-вторых, вы не всегда можете получить один и тот же результат (по крайней мере, не в контейнере Java EE).

Действительно, вы не хотите этого, поскольку это полностью побеждает точку JPA. Кроме того, вы не хотите самостоятельно выполнять эту проверку соединения низкого уровня.

Нет, вместо этого вы должны использовать (автономный) пул соединений , который позаботится об этом за вас. c3p0 является одним из них, и его можно настроить для проверки соединения и ведения журнала . Использование пула соединений означает меньшее количество кода, лучшую надежность, лучшие возможности восстановления, лучшие проверки без потери переносимости. Это похоже на беспроигрышную ситуацию для меня.

0 голосов
/ 21 января 2010

Обычно вы получаете доступ к своей базе данных, используя источник данных, и вы настраиваете его для того, чтобы делать то, что вам нужно, я вставляю здесь базовую конфигурацию, для подробной конфигурации Google для нее;)

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
    <local-tx-datasource>
    <jndi-name>EnterpriseDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@oracle10g:1521:sid</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>username</user-name>
    <password>password</password>

    <min-pool-size>5</min-pool-size>
    <max-pool-size>100</max-pool-size>
    <query-timeout>60</query-timeout>

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>  

    <metadata>
        <type-mapping>Oracle10g</type-mapping>
    </metadata>

  </local-tx-datasource>

</datasources>
0 голосов
/ 21 января 2010

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

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