由于我们的连接非常不稳定,我们决定在查询超时时切换到本地只读数据库。
但这是我的问题:我没有得到一个异常,当javax。持久性尝试查询:
// 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.jarJPA: javax.persistence_2.0.3.v201010191057.jarHibernate:
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>
谢谢托拜厄斯
解决方案:
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();
您可能看不到超时,因为一些数据库不支持该功能。
" javax.persistence.query。Timeout查询超时时间,单位为毫秒(整数或字符串),这是Hibernate使用的提示,但需要底层数据库的支持。"
详情见http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html
如果你不能保证可靠的连接,我倾向于一直切换到只读。