Hibernate UnknownServiceException :Inconnue service demandé que la transaction terminée
J'ai une classe simple qui commence à 3 fils et enregistre un nouvel objet dans chaque thread. Mais je suis d'exception qui je ne peux pas comprendre. Quelqu'un peut-il m'aider à comprendre pourquoi cette 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());
}
}
Et c'est la partie pertinente du fichier journal indiquant l'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>
La version d'Hibernate avez-vous utilisé? Pourriez-vous poster le fichier de configuration Hibernate?
Je suis de l'utilisation d'hibernate 4.1. J'ai édité mon post pour y inclure hibernate.cfg.xml. Merci.
Modifier cette propriété <property name="connexion.pool_size">1</propriété> Consultez le lien ci-dessous stackoverflow.com/questions/9802684/...
J'ai eu un problème similaire qui a été causé par quelques tentatives qui ont été faites après la
Je suis de l'utilisation d'hibernate 4.1. J'ai édité mon post pour y inclure hibernate.cfg.xml. Merci.
Modifier cette propriété <property name="connexion.pool_size">1</propriété> Consultez le lien ci-dessous stackoverflow.com/questions/9802684/...
J'ai eu un problème similaire qui a été causé par quelques tentatives qui ont été faites après la
SessionFactory
objet de clôture.OriginalL'auteur sachinrahulsourav | 2012-04-22
Vous devez vous connecter pour publier un commentaire.
Objet de Session en mode veille prolongée n'est pas thread-safe, vous ne devez pas utiliser la même séance, les différents threads, à moins que vous synchornize l'accès à l'objet de la Session.
OriginalL'auteur
Une Session est en fait un Unité de Travail qui doit être liée à l'exécution courant Thread. Une unité de travail groupe de plusieurs opérations DML à l'intérieur d'une transaction unique, qui ne peut réussir que si toutes les opérations réussissent. Si une session est atomique, et l'atomicité implique une exploitation unique thread.
La Session est également le 1er Niveau de Cache, de sorte que dans la Session en cours, vous obtiendrez toujours la même Entité de référence de l'objet, n'importe comment beaucoup de fois vous session d'appel.get() ou de la session.load(). Si une Session est thread-safe que lors du flush temps, vous pouvez exécuter une autre opération intermédiaire changements. Ainsi, une Session doit être isolé des autres de l'exécution de la Session, et l'isolement implique une exploitation unique thread.
Donc, une Session n'est pas destiné à être thread-safe pour préserver l'atomicité et l'isolation.
OriginalL'auteur
Appel
.openSession()
au lieu de.getCurrentSession()
aprèsgetSessionFactory()
.La
sessionFactory
objet est thread-safe, mais chaqueSession
objet doit être mono-thread.OriginalL'auteur
si son utile pour quelqu'un d'autre, pour moi, cela voulait dire "vous avez fait un mockito espion(base de données)" dans un précédent test de l'unité, qui en quelque sorte arrosé la veille prolongée. Allez comprendre.
OriginalL'auteur