我刚刚将一个 Spring Web 应用程序从 Hibernate 3.6 升级到 4.2,并且在我所见的范围内完成了所有必要的更改。应用程序本身似乎运行良好,但一些测试通过 Spring 的应用程序上下文测试支持使用 Hibernate,现在这些测试偶尔会失败并出现以下错误:
Caused by: org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.service.jdbc.connections.spi.ConnectionProvider]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:126)
at org.hibernate.internal.AbstractSessionImpl.getJdbcConnectionAccess(AbstractSessionImpl.java:261)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.<init>(JdbcCoordinatorImpl.java:97)
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.<init>(TransactionCoordinatorImpl.java:87)
at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:253)
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1599)
at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:965)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:412)
当以默认文件系统顺序运行时,它们似乎更可靠地运行,但我现在以随机顺序运行它们以更容易地重现它。一旦此错误发生一次,之后的所有类似测试似乎也都失败了。测试是使用注释设置的,@DirtiesContext
因此 Spring 测试运行器应该为每个类重新创建一个新的ApplicationContext
(以及 HSQLDB mem DB)。SessionFactory
所以不应该有任何东西从一个测试类泄漏到下一个测试类。
有任何想法吗?没有 ConnectionProvider 听起来 Hibernate 要么仍在启动,要么正在关闭。