Hibernate UnknownServiceException:作为事务完成请求的未知服务 [英] Hibernate UnknownServiceException :Unknown service requested as transaction completed

查看:586
本文介绍了Hibernate UnknownServiceException:作为事务完成请求的未知服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的类,它启动3个线程并在每个线程中保存一个新对象。但我得到了我无法理解的例外。任何人都可以帮我理解为什么这个异常?

  package test; 

import java.util.Date;

import org.hibernate.Session;

import domain.Event;

导入util.HibernateUtil;

public class EventBeanTest {

public static void main(String [] args){

Event e1 = new Event();
e1.setTitle(111);
e1.setDate(new Date());

事件e2 =新事件();
e2.setTitle(222);
e2.setDate(new Date());

事件e3 = new Event();
e3.setTitle(333);
e3.setDate(new Date());


线程t1 =新线程(new EventRunnable(e1));
线程t2 =新线程(new EventRunnable(e2));
线程t3 =新线程(新的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());

会话会话= HibernateUtil.getSessionFactory()。getCurrentSession();

session.beginTransaction();

session.saveOrUpdate(event);
session.getTransaction()。commit();

HibernateUtil.getSessionFactory()。close();

System.out.println(Finishing thread:+ Thread.currentThread()。getName());





这是相关部分显示异常的日志文件:

  Hibernate:从test.EVENTS中选择max(EVENT_ID)
Hibernate:insert into test.EVENTS(EVENT_DATE,TITLE,EVENT_ID)值(?,?,?)
Hibernate:插入到test.EVENTS(EVENT_DATE,TITLE,EVENT_ID)插入到test.EVENTS(EVENT_DATE,TITLE,EVENT_ID)值(?,?,?)
org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO:HHH000030:清理连接池[jdbc:mysql:// localhost:3306 / test]
整理线程:event - 333
2012年4月22日下午2点46分55秒org.hibernate .engine.transaction.internal.jdbc.JdbcTransaction afterAfterCompletion
INFO:HHH000425:无法关闭会话;吞噬异常[org.hibernate.service.UnknownServiceException:未知服务请求[org.hibernate.stat.spi.StatisticsImplementor]]作为事务已完成
线程中的异常event - 222org.hibernate.service.UnknownServiceException:Unknown service requested [org.hibernate.stat.spi.StatisticsImplementor]
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(Abst ractTransactionImpl.java:184)
at test.EventRunnable.run(EventBeanTest.java:60)$ b $ at java.lang.Thread.run(Thread.java:722)
2012年4月22日下午2:46:55 org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction afterAfterCompletion
INFO:HHH000425:无法关闭会话;吞噬异常[org.hibernate.service.UnknownServiceException:未知服务请求[org.hibernate.stat.spi.StatisticsImplementor]]作为事务已完成
线程事件 - 111中的异常org.hibernate.service.UnknownServiceException:未知service requested [org.hibernate.stat.spi.StatisticsImplementor]
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(Abst ractTransactionImpl.java:184)
at test.EventRunnable.run(EventBeanTest.java:60)
at java.lang.Thread.run(Thread.java:722)

$ b

编辑1

 <?xml version ='1.0'encoding ='utf-8'?> 



 < session-factory> 

<! - 数据库连接设置 - >
< property name =connection.driver_class> com.mysql.jdbc.Driver< / property>
< property name =connection.url> jdbc:mysql:// localhost:3306 / test< / property>
< property name =connection.username> vishnu< / property>
< property name =connection.password> con02305< / property>

<! - JDBC连接池(使用内置) - >
< property name =connection.pool_size> 1< / property>

<! - - SQL方言 - >
< property name =hibernate.dialect> org.hibernate.dialect.MySQLDialect< / property>

<! - 启用Hibernate的自动会话上下文管理 - >
< property name =current_session_context_class>线程< / property>

<! - 禁用二级缓存 - >
< property name =cache.provider_class> org.hibernate.cache.internal.NoCacheProvider< / property>

<! - 将所有执行的SQL回复到stdout - >
< property name =show_sql> true< / property>

<! - 在启动时删除并重新创建数据库模式
< property name =hbm2ddl.auto>更新< / property> - >

< property name =default_schema>测试< /属性>
< property name =show_sql> true< / property>

< mapping resource =domain / Event.hbm.xml/>

< / session-factory>


解决方案

Hibernate中的Session对象不是线程安全的,除非您同步对Session对象的访问,否则不应该在不同线程中使用同一个会话。


I have a simple class which starts 3 threads and saves a new object in each thread. But I am getting exception which i cannot understand. Can anyone help me understand why the 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());

    }
}

And this is the relevant part of the log file showing the 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)

EDIT 1

<?xml version='1.0' encoding='utf-8'?>

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="connection.username">vishnu</property>
    <property name="connection.password">con02305</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup 
    <property name="hbm2ddl.auto">update</property> -->

    <property name="default_schema">test</property>
    <property name="show_sql">true</property>

    <mapping resource="domain/Event.hbm.xml"/>

</session-factory>

解决方案

Session object in Hibernate is not thread safe, you should not use the same session in different threads, unless you synchornize access to Session object.

这篇关于Hibernate UnknownServiceException:作为事务完成请求的未知服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆