2011-09-20 35 views
1

由於我們的連接非常不穩定,所以如果查詢超時,我們決定切換到本地只讀數據庫。JPA + MySQL:超時後 - >使用本地連接

但這裏是我的問題:當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 休眠:

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> 

謝謝 托比亞斯

回答

0

解決方案:

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(); 
0

您可能不會看到超時,因爲某些數據庫不支持該功能。

「以毫秒爲單位 (整數或字符串)javax.persistence.query.timeout查詢超時,這是由Hibernate使用的提示,但需要通過基礎數據庫 的支持。」

查看http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html瞭解更多詳情。

如果您無法保證可靠的連接,我傾向於只能一直切換到只讀模式。