JPA + MySQL: после истечения времени ожидания -> использовать локальное соединение - PullRequest
1 голос
/ 20 сентября 2011

, поскольку наше соединение очень нестабильно, мы решили переключиться на нашу локальную базу данных только для чтения, если время ожидания запроса истекло.

Но вот моя проблема: я не получаю исключение при попытке javax.persistenceна запрос:

// Attribute
        EntityManagerFactory entityManagerFactory;
        EntityManager manager;

        entityManagerFactory = Persistence
                .createEntityManagerFactory("org.hibernate.tutorial.jpa");

        manager = entityManagerFactory.createEntityManager();

        try {
            Query query = manager.createQuery(String.format(
                    "SELECT u FROM User u WHERE u.id = '%s'", 116));

            User user = (User) query.getSingleResult();
            manager.refresh(user);

            System.out.println(user.getUsername());

        } catch (org.hibernate.QueryTimeoutException ex) {
            throw new QueryTimeoutException("timeout");
        }
    }

Это всего лишь тест, демонстрирующий мою проблему.Чего мне не хватает?

Mysql: mysql-connector-java-5.1.16-bin.jar JPA: javax.persistence_2.0.3.v201010191057.jar Hibernate:

115 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
124 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.6.7.Final
126 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
129 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
132 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
208 [main] INFO org.hibernate.ejb.Version - Hibernate EntityManager 3.6.7.Final

persistence.xml:
    <properties>
    <property name="hibernate.hbm2ddl.auto" value="valide"/>
    <property name="hibernate.connection.url" value="jdbc:mysql:///database?zeroDateTimeBehavior=convertToNull"/>
    <property name="hibernate.connection.username" value="user"/>
    <property name="hibernate.connection.password" value="pass"/>
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
    <property name="javax.persistence.query.timeout" value="1"/>
    <property name="dialect" value="org.hibernate.dialect.MySQLDialect"/>
    </properties>

СпасибоTobias

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Возможно, вы не видите тайм-аут, потому что некоторые БД не поддерживают эту функцию.

"Тайм-аут запроса javax.persistence.query.timeout в миллисекундах (Integer или String), это подсказка, используемая Hibernate, но требует поддержка вашей базой данных. "

Подробнее см. http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html.

Я был бы склонен все время переключаться только на чтение, если вы не можете гарантировать надежное соединение.

0 голосов
/ 22 сентября 2011

Решение:

Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://server/database", "user", "pass");

Каждый раз, когда я хочу запустить запрос, я проверяю, живо ли соединение:

if (connection.isValid(1)) {
return true;
} else {
throw new NoConnectionException();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...