2012-04-16 34 views
8

Tôi đang di chuyển dự án của tôi từ mùa xuân 3,0 + ngủ đông 3.6.x để S3.1 + H4.1Xuân 3.1 + Hibernate 4.1 Propagation.Supports vấn đề

mã mới của tôi là như sau

<context:component-scan base-package="x.y.z"> 
</context:component-scan> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
<props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.x</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    </props> 
    </property> 
     <property name="annotatedClasses"> 
     <list> 
     <value>x.y.z.entities.Student</value>   
     </list> 
    </property> 
    </bean> 

<bean id="transactionManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

<aop:config> 
    <aop:pointcut id="daoServicePoint" 
      expression="execution(* x.y.z.StudentDao.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="daoServicePoint"/> 
    </aop:config> 

    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
     <tx:method name="save*" propagation="REQUIRED"/> 
     <tx:method name="update*" propagation="REQUIRED"/> 
     <tx:method name="delete*" propagation="REQUIRED"/> 
    <tx:method name="get*" propagation="SUPPORTS" read-only="true"/> 
    </tx:attributes> 
    </tx:advice> 

Khi chạy getStudent phương pháp đánh dấu như hỗ trợ và chỉ đọc tôi nhận được

org.hibernate.HibernateException: No Session found for current thread 
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024) 

nó từng là ok với Spring 3.0 và Hibernate 3.6.x bây giờ nó đã thay đổi. Tôi undestood từ mùa xuân diễn đàn mà cắt Tôi cần đánh dấu giao dịch YÊU CẦU nếu tôi cần phải sử dụng sessionFactory.getCurrentSession();

Tôi sử dụng kỹ thuật cấp thấp hơn để có được tốc độ đồng thời tối đa trong mã của tôi. Khi thực hiện các hoạt động yêu cầu một số nhận/lưu/cập nhật/truy vấn tôi đã thực hiện theo cách sau:

  1. gọi là phương pháp được đánh dấu là SUPPORTS.
  2. Thực hiện tất cả các truy vấn nhận được cũng được đánh dấu là SUPPORTS bên trong phương thức đầu tiên .
  3. sau đó bắt đầu truy vấn được đánh dấu là REQUIRED bên trong cùng một phương thức và đây là một điểm nơi giao dịch quay lại có thể quay của tôi bắt đầu.

Tôi đã cải thiện hiệu suất tốt bằng kỹ thuật này, nhưng đánh dấu tất cả các phương pháp của tôi là YÊU CẦU phá hủy nó.

Làm cách nào để khắc phục sự cố?

+0

Xác định hiệu suất "phá hủy". Đó là "kỹ thuật cấp thấp hơn" không có vẻ như nó sẽ cung cấp cho bạn nhiều cải thiện hiệu suất nếu trong bước 3 bạn vẫn cần phải mở một giao dịch, có thể ngoại trừ các thực thể được nạp ở bước 2 không bị kiểm tra bẩn và bộ nhớ đệm. Hoặc là cải tiến hiệu suất mà bạn đã thấy trong toàn bộ hệ thống, bởi vì có nhiều cuộc gọi đến các phương pháp chưa bao giờ đến bước 3? –

+0

Ngoài sự tò mò: bạn đã đo lường mức tăng hiệu suất của mẹo nhỏ của mình chưa? Tôi nghi ngờ nó có giá trị nỗ lực, trừ khi bạn có một số yêu cầu hiệu suất nghiêm trọng của sản phẩm của bạn. –

+0

@RasmusFranke, May mắn thay nó không phải là một cái gì đó mà tôi phát minh ra. Tôi chỉ đọc bài viết này. http://www.ibm.com/developerworks/java/library/j-ts5/index.html –

Trả lời

0

tôi nghĩ bạn vẫn có thể đánh dấu giao dịch là chỉ đọc. không chắc chắn nếu nó có tác động hiệu suất.

+0

Không. Bạn không thể. –

+1

Tại sao? Tôi đang sử dụng @Transactional (readOnly = true) và nó hoạt động tốt với Hibernate 4 và spring 3.1 –

+0

Xin lỗi, nguyên nhân bạn có thể :) –

3

tôi gặp phải vấn đề tương tự khi thử nghiệm với Spring và Hibernate 3/4.

Dường như đây là một vấn đề được biết đến, được mô tả trong các liên kết JIRA sau.

https://jira.springsource.org/browse/SPR-9020

Dường như Hibernate 4 phiên bản của SpringSessionContext không mở một phiên mới nếu không có hiện giao dịch/phiên mở và gọi là phương pháp @Transactional được cấu hình với Propagation.SUPPORTS tuyên truyền =.

+0

điều này đang xảy ra với tôi cũng vậy .. bạn đã làm gì? – thiagoh

+0

@thiagoh Tôi xin lỗi vì trả lời muộn.Tôi đã không có nhu cầu làm việc trên một giải pháp cho điều này bởi vì tôi đã không gặp phải vấn đề. Tôi chỉ tìm kiếm lý do tại sao điều này không hiệu quả. Có một vài gợi ý về cách giải quyết vấn đề này trong phần bình luận của JIRA mà tôi đã tham chiếu. Một trong số đó là thay đổi tuyên truyền thành nội dung khác (ví dụ: PROPAGATION_REQUIRED). Cách khác là triển khai lớp CurrentSessionContext tùy chỉnh tạo một Phiên trong trường hợp này và liên kết nó với SessionFactory mà bạn đang sử dụng. – mess

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