2012-04-22 9 views
13

Tengo una clase simple que inicia 3 hilos y guarda un nuevo objeto en cada hilo. Pero estoy recibiendo una excepción que no puedo entender. ¿Alguien puede ayudarme a entender por qué la excepción?Hibernate UnknownServiceException: servicio desconocido solicitado como transacción completada

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

    } 
} 

Y esta es la parte pertinente del archivo de registro con la excepción:

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) 

EDITAR 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> 

+0

¿Qué versión de Hibernate usaste? ¿Podría publicar el archivo de configuración de Hibernate? – kyiu

+0

Estoy usando hibernate 4.1. He editado mi publicación para incluir hibernate.cfg.xml. Gracias. – sachinrahulsourav

+0

Cambiar esta propiedad 1 Consulte a continuación el enlace http://stackoverflow.com/questions/9802684/hibernate-config-connection-pool-size –

Respuesta

17

objeto Session en Hibernate no es seguro para subprocesos, no se debe utilizar la misma sesión en diferentes temas, a menos que Synchornize acceso al objeto Session.

3

Llamada .openSession() en lugar de .getCurrentSession() después de getSessionFactory().
El objeto sessionFactory es seguro para subprocesos, pero cada objeto Session debe ser de subproceso único.

3

Una sesión es en realidad un Unit of Work que se debe vincular al subproceso en ejecución actual. Una unidad de trabajo agrupa varias operaciones DML dentro de una sola transacción que solo puede tener éxito si todas las operaciones tienen éxito. Entonces, una sesión es atómica, y la atomicidad implica un solo hilo operativo.

La sesión también es la memoria caché de primer nivel, por lo que en la sesión actual siempre obtendrá la misma referencia de objeto de entidad, sin importar cuántas veces llame a session.get() o session.load(). Si una sesión era segura para subprocesos que durante el tiempo de descarga, podría ejecutar otros cambios intermediarios de transacción. Por lo tanto, una sesión debe estar aislada de otra sesión de ejecución, y el aislamiento implica una sola cadena de operación.

Por lo tanto, una Sesión no está pensada para ser segura para la subprocesamiento a fin de preservar los requisitos de atomicidad y aislamiento.

+0

Hola Vlad, otra vez busco tu ayuda ya que puedo ver que respondiste una pregunta con un problema probablemente similar. ¿Podría echar un vistazo a esto:/http://stackoverflow.com/questions/31694247/unknownserviceexception-unknown-service-requested-hibernate-spring? – displayname

0

si es útil para alguien más, para mí esto significaba "hiciste un espía de mockito (base de datos)" en una prueba de unidad anterior, que de alguna manera hiberó. Imagínate.

Cuestiones relacionadas