2012-04-22 35 views
13

Tôi có một lớp đơn giản bắt đầu 3 luồng và lưu một đối tượng mới trong mỗi chuỗi. Nhưng tôi nhận được ngoại lệ mà tôi không thể hiểu được. Bất cứ ai có thể giúp tôi hiểu lý do tại sao ngoại lệ?Hibernate UnknownServiceException: Dịch vụ không xác định được yêu cầu khi giao dịch hoàn thành

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

    } 
} 

Và đây là phần có liên quan của các tập tin log cho thấy ngoại lệ:

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> 

+0

Bạn đã sử dụng phiên bản Hibernate nào? Bạn có thể đăng tập tin cấu hình Hibernate? – kyiu

+0

Tôi đang sử dụng chế độ ngủ đông 4.1. Tôi đã sửa bài viết của tôi để bao gồm hibernate.cfg.xml. Cảm ơn. – sachinrahulsourav

+0

Thay đổi thuộc tính này 1 Tham khảo liên kết bên dưới http://stackoverflow.com/questions/9802684/hibernate-config-connection-pool-size –

Trả lời

17

đối tượng Session trong Hibernate không phải là thread an toàn, bạn không nên sử dụng cùng một phiên trong chủ đề khác nhau, trừ khi bạn synchornize tiếp cận với đối tượng Session.

3

Gọi .openSession() thay vì .getCurrentSession() sau getSessionFactory().
Đối tượng sessionFactory có chủ đề an toàn nhưng mỗi đối tượng Session phải là đơn luồng.

3

Phiên thực sự là một Unit of Work cần được ràng buộc với Chuỗi thực thi hiện tại. Một đơn vị hoạt động nhóm nhiều hoạt động DML bên trong một giao dịch duy nhất có thể thành công chỉ khi tất cả các hoạt động thành công. Vì vậy, một phiên là nguyên tử, và nguyên tử ngụ ý một sợi vận hành đơn lẻ.

Phiên làm việc cũng là Cache cấp 1, vì vậy trong phiên hiện tại, bạn sẽ luôn nhận được cùng tham chiếu đối tượng thực thể, bất kể bạn gọi session.get() hoặc session.load() bao nhiêu lần. Nếu một phiên là an toàn luồng hơn trong thời gian tuôn ra, bạn có thể thực hiện các thay đổi trung gian giao dịch khác. Vì vậy, một phiên phải được phân lập từ phiên thực thi khác và cách ly ngụ ý một luồng vận hành đơn lẻ.

Vì vậy, Phiên không có nghĩa là an toàn chỉ để bảo toàn các yêu cầu về nguyên tử và cách ly.

+0

Hey Vlad, một lần nữa tôi tìm sự giúp đỡ của bạn vì tôi có thể thấy rằng bạn đã trả lời một câu hỏi với một vấn đề tương tự. Bạn có thể xem xét điều này:/http://stackoverflow.com/questions/31694247/unknownserviceexception-unknown-service-requested-hibernate-spring? – displayname

0

nếu nó hữu ích cho bất kỳ ai khác, với tôi điều này có nghĩa là "bạn đã làm một điệp viên mockito (cơ sở dữ liệu)" trong một bài kiểm tra đơn vị trước đó, mà bằng cách nào đó hosed hibernate. Đi con số.

Các vấn đề liên quan