spring3+hibernate4 service中多线程事务异常及解决

10 篇文章 0 订阅
4 篇文章 0 订阅

初次使用spring3结合hibernate4做项目,迅速配置完成,测试,一切正常。

然而,当我在service层中另外开启一个线程,线程中的方法需要进行数据库操作,这个时候,悲催的抛出了异常:-org.hibernate.HibernateException: No Session found for current thread

当然,hibernate4的session是和当前线程绑定的,多线程中用sessionFactory.getCurrentSession()获取当前session自然不存在,不存在又不会自动创建,所以抛出了异常,无可厚非。

于是就想着怎么解决这个问题。

遍翻google、baidu,大部分都说如何如何配置,设置事务的传播属性propagation="REQUIRED",开启opensessioninview filter等等,无一对此问题有何解释(当然或许是我没翻到,有知道的麻烦告知)

在http://sishuok.com/forum/blogPost/list/2625.html#7523上看到相关配置,我就想作者这个项目该多线程运行正常吧,果断下载源码,修改测试,oh。。。跟我的错一模一样!

于是再想,多线程中调用了service方法,service方法里面的数据库操作方法无法开启事务,那如果在controller中开启多线程调用service会不会也不能开启事务呢?果断测试,一切正常!不过这当然得正常,在controll中的多线程调用service方法就和平常的一个请求调用service方法一模一样,不正常那才不正常了呢!

于是再想,如果把事务配置在service和dao上,那么service中开启多线程后,虽然多线程中的service没有事务,但是service中的dao有事务啊,当然多个数据库操作无法在一个事务中了,也不管那么多了,先测试,于是修改aop配置为:

    <aop:config expose-proxy="true">
        <aop:pointcut id="managerMethod" expression="execution(* com.news.service.*Service..*.*(..)) or execution(* com.news.dao.*Dao..*.*(..))" />
        <aop:advisor pointcut-ref="managerMethod" advice-ref="txAdvice" />
    </aop:config>

测试,成功运行!

以前事务管理类为org.springframework.orm.hibernate4.HibernateTransactionManager时项目无恙,换成hibernate4对应的org.springframework.orm.hibernate4.HibernateTransactionManager后就出现了这个问题,摸索了半天也没彻底解决,有高人知道完美解决方案麻烦赐教。

先这样配着吧,虽然有缺陷,也只有让它先跑着了。

项目事务相关配置如下所示:

<bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="change*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="get*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="query*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    <aop:config expose-proxy="true">
        <aop:pointcut id="managerMethod" expression="execution(* com.news.service.*Service..*.*(..)) or execution(* com.news.dao.*Dao..*.*(..))" />
        <aop:advisor pointcut-ref="managerMethod" advice-ref="txAdvice" />
    </aop:config>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring MVC、Spring 3和Hibernate 4是常用的Java开发框架和库。你可以通过以下步骤来下载它们的jar包。 1. Spring MVC的jar包下载: 你可以在Spring官方网站(https://spring.io/)的"Projects"部分找到Spring MVC的相关信息和下载链接。在该页面上,你可以找到最新版本的Spring MVC并下载与之对应的jar包。 2. Spring 3的jar包下载: 同样,你可以在Spring官方网站上找到Spring 3的相关信息和下载链接。在该网站上,你可以找到Spring 3的最新版本并下载相应的jar包。 3. Hibernate 4的jar包下载: 你可以在Hibernate官方网站(https://hibernate.org)的"Downloads"部分找到Hibernate 4的相关信息和下载链接。在该页面上,你可以找到最新版本的Hibernate 4并下载对应的jar包。 无论是Spring MVC、Spring 3还是Hibernate 4,你可以选择下载官方提供的jar包来开始你的项目,也可以通过maven等构建工具来管理它们的依赖关系。在将这些jar包添加到你的项目时,你应该将它们添加到你的构建路径下,并在项目配置文件配置相应的引用和依赖。 希望以上的回答能够对你有所帮助! ### 回答2: 要下载Spring MVC,Spring 3以及Hibernate 4的jar包,有以下几种方法可供选择: 方法一:通过官方网站下载 你可以直接访问Spring官方网站(https://spring.io/)和Hibernate官方网站(https://hibernate.org/orm/)的下载页面,在这些页面上你可以找到相关的jar包。Spring官方网站提供了关于Spring MVC和Spring 3的jar包下载链接,Hibernate官方网站提供了关于Hibernate 4的jar包下载链接。 方法二:使用Maven依赖管理工具 如果你使用Maven作为项目构建工具,可以在项目的pom.xml文件添加相关依赖,然后使用Maven自动下载这些jar包。在pom.xml文件,你需要添加Spring MVC、Spring 3和Hibernate 4的相应依赖配置,然后运行Maven命令执行依赖下载。 方法三:使用Gradle依赖管理工具 如果你使用Gradle作为项目构建工具,可以在项目的build.gradle文件添加相关依赖,然后使用Gradle自动下载这些jar包。在build.gradle文件,你需要添加Spring MVC、Spring 3和Hibernate 4的相应依赖配置,然后运行Gradle命令执行依赖下载。 总之,你可以通过访问官方网站下载jar包,也可以使用Maven或Gradle工具自动下载。无论选择哪种方法,确保下载的jar包版本与你的项目要求的版本匹配,以确保项目能够正常运行。 ### 回答3: 可以在官方网站和第三方资源库下载Spring MVC、Spring 3和Hibernate 4的JAR包。以下是一些常用的下载渠道: 1. 官方网站下载:可以通过Spring官方网站(https://spring.io/projects/spring-framework)下载Spring MVC和Spring 3的JAR包。在网站上找到相应的版本并下载相关的JAR文件。 2. Maven下载:如果你使用Maven项目管理工具,你可以在pom.xml文件添加相应的依赖关系,然后Maven会自动下载所需的JAR包。例如,你可以添加以下依赖项以下载Spring MVC、Spring 3和Hibernate 4的JAR包: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.11.Final</version> </dependency> ``` 然后,执行Maven的更新命令以下载所需的依赖项。 3. 第三方资源库下载:除了官方网站外,还可以通过其他资源库如Apache Maven仓库(https://mvnrepository.com/)或JCenter(https://bintray.com/bintray/jcenter)下载Spring MVC、Spring 3和Hibernate 4的JAR包。在这些资源库的网站上搜索所需的JAR包,然后下载适合你的版本。 无论你选择哪种方式,下载所需的JAR包后,你可以将它们添加到你的项目构建路径,以便在开发过程使用Spring MVC、Spring 3和Hibernate 4的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值