前言:
公司最近一个项目用到Spring和Mybatis,发现用起来挺方便,比以前的那个struts+hibernate舒服多了。废话少说,直接摆问题,碰到的问题是,mybatis不在事务中运行,后台日志报 “Closing no transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@19006c9]”错误。无论是加了@Transactional注解和是没加都报这个信息。一个方法中插入多条数据,某次插入失败也不回滚。
问题描述:
环境: Spring 3.1.0 + Mybatis 3.1.0 + mybatis-spring 1.0.0 RC3 + DB2 9.5 + Tomcat 6.0.35
web工程名称: isap
配置文件:applicationContext.xml + isap-servlet.xml
先看配置信息:
applicationContext.xml
01 |
<? xml version = "1.0" encoding = "UTF-8" ?>
|
02 |
< beans xmlns = "http://www.springframework.org/schema/beans"
|
03 |
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
|
04 |
xmlns:tx = "http://www.springframework.org/schema/tx"
|
05 |
xmlns:context = "http://www.springframework.org/schema/context"
|
07 |
http://www.springframework.org/schema/beans
|
08 |
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
09 |
http://www.springframework.org/schema/tx
|
10 |
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
|
11 |
http://www.springframework.org/schema/context
|
12 |
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
|
16 |
< bean id = "dataSource" class = "org.springframework.jndi.JndiObjectFactoryBean" >
|
17 |
< property name = "jndiName" >
|
18 |
< value >java:comp/env/jndi_isap</ value >
|
22 |
< bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" >
|
23 |
< property name = "configLocation" value = "classpath:config/mybatis-config.xml" ></ property >
|
24 |
< property name = "dataSource" ref = "dataSource" />
|
25 |
< property name = "mapperLocations" >
|
27 |
< value >classpath:com/cosbulk/isap/*/dao/mapper/*Mapper.xml</ value >
|
32 |
< bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
|
33 |
< property name = "dataSource" ref = "dataSource" />
|
34 |
< qualifier value = "isap" />
|
38 |
< tx:annotation-driven transaction-manager = "transactionManager" />
|
40 |
< bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" >
|
41 |
< property name = "sqlSessionFactory" ref = "sqlSessionFactory" />
|
42 |
< property name = "basePackage" value = "com.cosbulk.isap" ></ property >
|
48 |
< bean id = "smisDataSource" class = "org.springframework.jndi.JndiObjectFactoryBean" >
|
49 |
< property name = "jndiName" >
|
50 |
< value >java:comp/env/jndi_smis</ value >
|
53 |
< bean id = "smisSqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" >
|
54 |
< property name = "configLocation" value = "classpath:config/mybatis-config.xml" ></ property >
|
55 |
< property name = "dataSource" ref = "smisDataSource" />
|
56 |
< property name = "mapperLocations" >
|
58 |
< value >classpath:com/cosbulk/smis/dao/mapper/*Mapper.xml</ value >
|
62 |
< bean id = "smisTransactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
|
63 |
< property name = "dataSource" ref = "smisDataSource" />
|
64 |
< qualifier value = "smis" />
|
67 |
< tx:annotation-driven transaction-manager = "smisTransactionManager" />
|
69 |
< bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" >
|
70 |
< property name = "sqlSessionFactory" ref = "smisSqlSessionFactory" />
|
71 |
< property name = "basePackage" value = "com.cosbulk.smis" ></ property >
|
在applicationContext.xml文件中,主要配置了数据源和dao接口以及mapper文件相关信息,其他的bean信息在isap-servlet.xml文件中定义。
配置文件: isap-servlet.xml
01 |
<? xml version = "1.0" encoding = "UTF-8" ?>
|
02 |
< beans xmlns = "http://www.springframework.org/schema/beans"
|
03 |
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:p = "http://www.springframework.org/schema/p"
|
04 |
xmlns:context = "http://www.springframework.org/schema/context"
|
05 |
xmlns:mvc = "http://www.springframework.org/schema/mvc"
|
07 |
http://www.springframework.org/schema/beans
|
08 |
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
09 |
http://www.springframework.org/schema/context
|
10 |
http://www.springframework.org/schema/context/spring-context-3.0.xsd
|
11 |
http://www.springframework.org/schema/mvc
|
12 |
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
|
13 |
default-autowire = "byName" >
|
15 |
< span style = "color:#ff0000;" >< strong >
|
16 |
< context:component-scan base-package = "com.cosbulk.isap" >
|
17 |
< context:exclude-filter type = "regex" expression = "com.cosbulk.isap.*.*.model" />
|
18 |
< context:exclude-filter type = "regex" expression = "com.cosbulk.isap.*.*.dao.*" />
|
19 |
</ context:component-scan >
|
21 |
< context:component-scan base-package = "com.cosbulk.smis" >
|
22 |
< context:exclude-filter type = "regex" expression = "com.cosbulk.smis.*.*.model" />
|
23 |
< context:exclude-filter type = "regex" expression = "com.cosbulk.smis.*.*.dao.*" />
|
24 |
</ context:component-scan ></ strong ></ span >
|
25 |
< mvc:annotation-driven />
|
29 |
< bean class = "com.cosbulk.isap.common.interceptor.CheckLoginInterceptor" />
|
33 |
< bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" >
|
34 |
< property name = "defaultEncoding" value = "UTF-8" />
|
39 |
< bean id = "exceptionResolver" class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
|
40 |
< property name = "defaultErrorView" >
|
41 |
< value >errorPages/error</ value >
|
43 |
< property name = "defaultStatusCode" >
|
46 |
< property name = "warnLogCategory" >
|
47 |
< value >org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</ value >
|
49 |
< property name = "exceptionMappings" >
|
51 |
< prop key = "org.springframework.web.multipart.MaxUploadSizeExceededException" >errorPages/maxUploadExceeded</ prop >
|
57 |
< bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >
|
58 |
< property name = "viewClass" value = "org.springframework.web.servlet.view.JstlView" />
|
59 |
< property name = "prefix" value = "/view/" />
|
60 |
< property name = "suffix" value = ".jsp" />
|
在这个配置文件里进行了所有的注解(@Controller、@Service等)扫描和mvc相关配置。
事务场景:
Service层通过注解@Transactional注入事务
03 |
@Transactional ( "isap" )
|
04 |
public class UserService{
|
06 |
private UserDao userDao;
|
13 |
return userDao.getId();
|
21 |
public void updateUser(User user,Map<String,Object> param) {
|
23 |
userDao.updateUser(user);
|
25 |
userDao.deleteUserRole(param);
|
29 |
insertUserRole(param);
|
测试过几次updateUser的调用,事务就是不起作用的,后台log信息如下:
1 |
DEBUG 2011 - 09 - 04 16 : 19 : 46 , 672 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: JDBC Connection [org.apache.commons.dbcp.PoolableConnection @67aece ] will not be managed by Spring
|
3 |
DEBUG 2011 - 09 - 04 16 : 19 : 46 , 672 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession @19006c9 ] was not registered for synchronization because synchronization is not active
|
5 |
DEBUG 2011 - 09 - 04 16 : 19 : 46 , 687 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: Committing JDBC Connection [org.apache.commons.dbcp.PoolableConnection @67aece ]
|
7 |
DEBUG 2011 - 09 - 04 16 : 19 : 46 , 687 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: Closing no transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession @19006c9 ]
|
9 |
DEBUG 2011 - 09 - 04 16 : 19 : 46 , 687 org.springframework.jdbc.datasource.DataSourceUtils: Returning JDBC Connection to DataSource
|
解决方案:
1、配置文件的问题吧? (见http://www.iteye.com/topic/1123069)
03 |
< context:component-scan base-package = "com.kimho" >
|
04 |
< context:exclude-filter type = "annotation" expression = "org.springframework.stereotype.Controller" />
|
05 |
</ context:component-scan >
|
07 |
2、servlet-context.xml: |
09 |
< context:component-scan base-package = "com.kimho" >
|
10 |
< context:exclude-filter type = "annotation" expression = "org.springframework.stereotype.Service" />
|
11 |
</ context:component-scan >
|
我做了相应的修改,把isap-servlet里的bean扫描拆成了两部分,分别放入applicationContext.xml和isap-servlet.xml文件中。
applicationContext.xml中加入:
2 |
< context:component-scan base-package = "com.cosbulk.isap" >
|
3 |
< context:include-filter type = "annotation" expression = "org.springframework.stereotype.Service" />
|
4 |
</ context:component-scan >
|
6 |
< context:component-scan base-package = "com.cosbulk.smis" >
|
7 |
< context:include-filter type = "annotation" expression = "org.springframework.stereotype.Service" />
|
8 |
</ context:component-scan >
|
isap-servlet.xml文件中,扫描bean部分换成:
2 |
< context:component-scan base-package = "com.cosbulk.isap" >
|
3 |
< context:exclude-filter type = "annotation" expression = "org.springframework.stereotype.Service" />
|
4 |
</ context:component-scan >
|
6 |
< context:component-scan base-package = "com.cosbulk.smis" >
|
7 |
< context:exclude-filter type = "annotation" expression = "org.springframework.stereotype.Service" />
|
8 |
</ context:component-scan >
|
重启服务器测试,发现效果和之前一样,事务还是没起作用。开始以为是和包扫描的位置有关,于是把扫描的位置放到文件末尾,发现还是没有起作用。最后偶然一个想法clean了下tomcat,然后重启,居然事务有效了。
总结: 修改完配置文件后,clean下工程,重启加载新的配置文件。OK,问题解决。
2、如果按照你的步骤设置为ID为null的话,那么就需要捕获mybatis抛出的异常,然后在catch语句中抛出一个Exception,这个时候Spring容器的事务管理就会起作用,会回滚事务。
3、如果用mysql数据库,数据库表你如果是自动建表,那么就需要把建表的Engine设置为InnoDB格式,自动建表的格式为:MyISAM,这中格式的是不支持事务管理的。
总结下: Spring在使用ContextLoadListener加载applicationContext.xml或其他名称的xml文件时,能进行数据源和相关事务注解的检查,启动事务特性。若在isap-servlet.xml文件中加载是,仅作为普通bean定义加载。所以一个良好的习惯就是,分层配置相关的bean。applicationContext.xml中配置数据库相关的bean(dao、service等), isap-servlet中配置mvc相关的bean(controller等)。
转自:http://blog.csdn.net/walkerjong/article/details/7839002
2012-04-26 11:17 1350人阅读 收藏 举报
用spring aop配置了事务,但是不起作用,困扰了好久。
事务配置如下:
<!-- 配置事务管理器,使用jdbc事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 申明式事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.xiu.xclk.web.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
</aop:config>
查网上,有的说是因为spring mvc自动扫描的时候,把包括@service的注解一下都扫描今天了,所以在开始的时候要先排除掉对@service注解的扫描,见帖子:http://www.linuxso.com/architecture/14904.html
配置好之后,事务还是不起作用,很奇怪,之后查找,一个帖子给了很大的启发:http://hi.baidu.com/jakoes/blog/item/7256efc2c7ec30190ff477dc.html,说是Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,我的代码中抛的是java.lang.Exception,改成抛RuntimeException,事务起作用了。帖子中说两种办法可以解决:
1,在事务属性后面加上需要回滚的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那个"-",对应的是"+")
2, 不改配置文件,将需要事务回滚的异常继承自unchecked exception类,也就是RuntimeException。
那么对于第二种方法,我的是起作用了,但是第一种方法我的是声明了对Exception回滚了啊。后来一想,是不是要写全java类名啊,于是改成:
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>,这样就起作用了。看来还是自己大意了,spring的配置文件要写全类名的。
相关推荐
植物病害分割系统源码&数据集分享
PHP开发的二级域名分发系统源码 已对接易支付 PHP7.2 需要安装SG11扩展 放进根目录 解压 然后 设置伪静态 一定要先设置伪静态 要不然404 最后打开你的域名直接进入安装步骤
微信小程序学易通(仿学习通)仅供学习参考
BP回归分析.xlsx
棒球运动物体检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
叶片检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
Simpack与Abaqus联合仿真:车轨刚柔耦合模型建模全攻略,simpack与abaqus联合仿真教程 车轨刚柔耦合仿真教程 刚柔耦合模型 出simpack与abaqus联合仿真车轨刚柔耦合模型教程,包括柔性钢轨建模,fbi文件生成,钢弹簧浮置板搭建,轨道不平顺激励等,包括模型。 ,simpack; abaqus; 联合仿真; 车轨刚柔耦合; 柔性钢轨建模; FBI文件生成; 钢弹簧浮置板; 轨道不平顺激励; 刚柔耦合模型。,Simpack与Abaqus联合仿真车轨刚柔耦合模型教程
python脚本调用deepseek api 生成聊天机器人,前提需要自己购买api
魔众企业官网系统采用PHP+Mysql架构,是一款对SEO非常友好、功能全面、安全稳定、支持多终端展示并且使用起来极其简单的企业建站系统。 魔众企业官网系统,帮助企业完美展示自己的形象。 2022年08月17日魔众企业官网系统发布v5.1.0版本,增加了以下22个特性: ·[新功能] 文件上传切片最大2M,分片文件根据配置动态清除 ·[新功能] UEditorPlus升级到2.3.0 ·[新功能] 图标库新增 check-simple ·[新功能] Cookie库新增属性参数 ·[新功能] 登录界面全新改版大气美观 ·[新功能] 用户授权模块微信小程序优化 ·[新功能] 后台管理员角色新增备注字段 ·[新功能] 富文本组件新增 editor-ready 自定义事件 ·[新功能] Response新增停止执行抛出消息的方法 ·[新功能] Grid新增批量弹窗快捷操作方式 ·[新功能] Grid编辑操作名称可自定义 ·[新功能] Json组件增加高度可配置参数 ·[新功能] Type类型数据新增导出JS配置文件 ·[新功能] bodyProperties可为body标签增加属性 ·[系
"基于遗传算法GA的柔性作业车间调度问题(FJSP)求解方法研究及MATLAB代码实现",FJSP:遗传算法GA求解柔性作业车间调度问题(FJSP),提供MATLAB代码 ,FJSP; 遗传算法GA; 柔性作业车间调度; MATLAB代码; 求解。,FJSP的遗传算法GA求解MATLAB代码实现
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
.
java代码实现 心形输出
内容: 本研究观察并收集了来自苏珊沼泽图勒红潮汐恢复点(坐标:38.117843, -121.983199)的钩虾(Gammarus sp.),时间跨度为2021年1月至12月。所有观察和采集工作均在修复地点二级潮汐通道中不超过20厘米深的微咸水中进行,距离提供的GPS坐标0.25英里范围内。钩虾的采集是在加利福尼亚科学采集许可证编号S-201970002-20281-001下进行的。每月的野外观察和捕捉以5米的间隔在8个半永久性的20米样带上进行,这些样带设置在相同区域的芦苇和本地植物冠层中,其中0米表示潮汐通道边缘。我们通过使用火鸡吸管捕获离散的水池(约60克水)来测量浮游无脊椎动物的生物多样性。水样本经过0.125毫米滤网过滤后,用去离子水冲洗,并在玫瑰苯胺染色的70%乙醇溶液中保存。 该研究提供了5组数据集,详情请参见:"" ()。
基于S7-1200 PLC的西门子博途4×4立体车库控制系统:PLC组态仿真、电气原理图与IO表综合研究报告,基于plc的立体车库控制系统,西门子博途4×4立体车库控制系统,S7-1200PLC编程,wincc组态仿真,系统包括PLC组态仿真,电气原理图,PLC接线图,IO表,报告等 ,基于plc的立体车库控制; 西门子博途4x4立体车库控制系统; S7-1200PLC编程; wincc组态仿真; 控制系统组成(含PLC组态仿真); 电气原理图; PLC接线图; IO表; 报告,西门子S7-1200PLC驱动的立体车库控制系统开发与仿真研究
chromedriver-win32-135.0.7004.0 (Canary).zip
这款资源系统是一款基于PHP和MySQL开发的内容管理系统(CMS),广泛应用于资源分享、下载站点的搭建。该系统以简洁、高效、易用为特点,适合快速构建资源类网站。 核心功能 资源管理:支持多种资源类型(如软件、文档、视频等)的上传、分类、展示和下载。 用户系统:提供用户注册、登录、权限管理等功能,支持用户积分、等级制度。 SEO优化:内置SEO功能,支持自定义URL、关键词、描述等,提升搜索引擎排名。 模板管理:支持多套模板切换,用户可以根据需求自定义网站外观。 插件扩展:系统支持插件机制,用户可以通过安装插件扩展功能,如支付接口、社交分享等。 安全机制:内置防SQL注入、XSS攻击等安全机制,保障系统安全。 适用场景: 资源下载站 软件分享平台 文档分享站点 视频资源站
介绍: 在2025年,随着技术的不断进步和用户需求的多样化,社区平台的设计与功能也在不断演变。StarFree作为一款全新的唯美风格社区源码,凭借其独特的设计理念和强大的功能,迅速成为了开发者与用户关注的焦点。本文将为您详细介绍StarFree源码的特点、功能以及应用场景。 1. 唯美设计,极致视觉体验 StarFree源码以“唯美”为核心设计理念,采用了简约而不失优雅的UI设计。整体界面以柔和的色调为主,搭配流畅的动画效果,为用户带来极致的视觉享受。无论是社区主页、个人中心,还是帖子详情页,每一个细节都经过精心打磨,确保用户在浏览时感受到舒适与愉悦。 2. 模块化架构,灵活扩展 StarFree采用模块化架构设计,开发者可以根据需求自由组合或扩展功能模块。无论是社交互动、内容发布,还是用户管理,每个模块都独立且高效,便于二次开发与定制。这种设计不仅降低了开发难度,还提高了系统的可维护性。 3. 多端适配,无缝体验 StarFree源码支持多端适配,包括Web端、移动端(iOS/Android)以及小程序。无论用户通过哪种设备访问社区,都能获得一致且流畅的体验。源码内置响应式布局
支持TIA_Portal_V20的固件库,可以下载更新最新库。
树木检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]