Hibernate UnknownServiceException:在事务完成时请求未知服务
我有一个简单的类,它启动3个线程并在每个线程中保存一个新对象。 但是我得到了一些我无法理解的exception。 任何人都可以帮助我理解为什么例外?
package test; import java.util.Date; import org.hibernate.Session; import domain.Event; import util.HibernateUtil; public class EventBeanTest { public static void main(String [] args) { Event e1 = new Event(); e1.setTitle("111"); e1.setDate(new Date()); Event e2 = new Event(); e2.setTitle("222"); e2.setDate(new Date()); Event e3 = new Event(); e3.setTitle("333"); e3.setDate(new Date()); Thread t1 = new Thread(new EventRunnable(e1)); Thread t2 = new Thread(new EventRunnable(e2)); Thread t3 = new Thread(new EventRunnable(e3)); t1.setName("event - 111"); t2.setName("event - 222"); t3.setName("event - 333"); t1.start(); t2.start(); t3.start(); } } class EventRunnable implements Runnable { private Event event; public EventRunnable(Event event) { this.event = event; } public void run() { System.out.println("Starting thread : " + Thread.currentThread().getName()); Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); session.saveOrUpdate(event); session.getTransaction().commit(); HibernateUtil.getSessionFactory().close(); System.out.println("Finishing thread : " + Thread.currentThread().getName()); } }
这是显示exception的日志文件的相关部分:
Hibernate: select max(EVENT_ID) from test.EVENTS Hibernate: insert into test.EVENTS (EVENT_DATE, TITLE, EVENT_ID) values (?, ?, ?) Hibernate: insert into test.EVENTS (EVENT_DATE, TITLE, EVENT_ID) values (?, ?, ?) Hibernate: insert into test.EVENTS (EVENT_DATE, TITLE, EVENT_ID) values (?, ?, ?) Apr 22, 2012 2:46:55 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost:3306/test] Finishing thread : event - 333 Apr 22, 2012 2:46:55 PM org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction afterAfterCompletion INFO: HHH000425: Could not close session; swallowing exception[org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.stat.spi.StatisticsImplementor]] as transaction completed Exception in thread "event - 222" org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.stat.spi.StatisticsImplementor] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:126) at org.hibernate.internal.SessionFactoryImpl.getStatisticsImplementor(SessionFactoryImpl.java:1708) at org.hibernate.internal.SessionFactoryImpl.getStatistics(SessionFactoryImpl.java:1704) at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.afterTransaction(TransactionCoordinatorImpl.java:140) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.afterTransactionCompletion(JdbcTransaction.java:138) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:184) at test.EventRunnable.run(EventBeanTest.java:60) at java.lang.Thread.run(Thread.java:722) Apr 22, 2012 2:46:55 PM org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction afterAfterCompletion INFO: HHH000425: Could not close session; swallowing exception[org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.stat.spi.StatisticsImplementor]] as transaction completed Exception in thread "event - 111" org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.stat.spi.StatisticsImplementor] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:126) at org.hibernate.internal.SessionFactoryImpl.getStatisticsImplementor(SessionFactoryImpl.java:1708) at org.hibernate.internal.SessionFactoryImpl.getStatistics(SessionFactoryImpl.java:1704) at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.afterTransaction(TransactionCoordinatorImpl.java:140) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.afterTransactionCompletion(JdbcTransaction.java:138) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:184) at test.EventRunnable.run(EventBeanTest.java:60) at java.lang.Thread.run(Thread.java:722)
编辑1
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test vishnu con02305 1 org.hibernate.dialect.MySQLDialect thread org.hibernate.cache.internal.NoCacheProvider true <!-- Drop and re-create the database schema on startup update --> test true
Hibernate中的Session对象不是线程安全的,除非您同步访问Session对象,否则不应在不同的线程中使用相同的会话。
Session实际上是一个工作单元 ,应绑定到当前正在执行的Thread。 一个工作单元在单个事务中进行多个DML操作,只有在所有操作都成功时才能成功。 因此会话是primefaces的,而primefaces性意味着一个操作线程。
Session也是第一级缓存,因此在当前Session中,无论您调用session.get()或session.load()多少次,您都将获得相同的Entity对象引用。 如果会话是线程安全的而不是刷新时间,则可以执行其他事务中介更改。 因此,Session必须与其他正在执行的Session隔离,而隔离意味着单个操作线程。
因此,Session不是为了保持primefaces性和隔离要求的线程安全。
在getSessionFactory()
之后调用.openSession()
而不是.getCurrentSession()
getSessionFactory()
。
sessionFactory
对象是线程安全的,但每个Session
对象应该是单线程的。
如果它对其他人有帮助,对我而言,这意味着“你在之前的unit testing中做了一个模拟间谍(数据库)”,它以某种方式进行了hibernate。 去搞清楚。
- 如何从代理类中检索代理类?
- 无法打开JPA EntityManager进行交易; 嵌套exception是java.lang.IllegalStateException
- Propagation.REQUIRES_NEW不会在Spring中使用JPA创建新事务
- oracle上的Hibernate序列,@ GeneratedValue(strategy = GenerationType.AUTO)
- 如何在Hibernate中返回特定类型的列表而不是List ?
- 在持久化Hibernate之前自动设置bean值(列)?
- java.lang.NoClassDefFoundError:当我向控制器发送无效值时javax / el / PropertyNotFoundException
- 与hibernate的父/子关系出现问题
- 如何在Hibernate中使用TomEE