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:
- gọi là phương pháp được đánh dấu là
SUPPORTS
. - 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 . - 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ố?
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? –
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. –
@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 –