- 浏览: 514440 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (563)
- 工作经验 (12)
- 数据库 (13)
- Servlet (10)
- Struts2 (1)
- Spring (25)
- Eclipse (5)
- Hibernate (5)
- Eclips (8)
- HTTP (7)
- J2EE (21)
- EHcache (1)
- HTML (11)
- 工具插件使用 (20)
- JPA (2)
- 杂谈 (17)
- 数据结构与算法 (3)
- Cloud Foundry (1)
- 安全 (10)
- J2SE (57)
- SQL (9)
- DB2 (6)
- 操作系统 (2)
- 设计模式 (1)
- 版本代码管理工具 (13)
- 面试 (10)
- 代码规范 (3)
- Tomcat (12)
- Ajax (5)
- 异常总结 (11)
- REST (2)
- 云 (2)
- RMI (3)
- SOA (1)
- Oracle (12)
- Javascript (20)
- jquery (7)
- JSP自定义标签 (2)
- 电脑知识 (5)
- 浏览器 (3)
- 正则表达式 (3)
- 建站解决问题 (38)
- 数据库设计 (3)
- git (16)
- log4j (1)
- 每天100行代码 (1)
- socket (0)
- java设计模式 耿祥义著 (0)
- Maven (14)
- ibatis (7)
- bug整理 (2)
- 邮件服务器 (8)
- Linux (32)
- TCP/IP协议 (5)
- java多线程并发 (7)
- IO (1)
- 网页小工具 (2)
- Flash (2)
- 爬虫 (1)
- CSS (6)
- JSON (1)
- 触发器 (1)
- java并发 (12)
- ajaxfileupload (1)
- js验证 (1)
- discuz (2)
- Mysql (14)
- jvm (2)
- MyBatis (10)
- POI (1)
- 金融 (1)
- VMWare (0)
- Redis (4)
- 性能测试 (2)
- PostgreSQL (1)
- 分布式 (2)
- Easy UI (1)
- C (1)
- 加密 (6)
- Node.js (1)
- 事务 (2)
- zookeeper (3)
- Spring MVC (2)
- 动态代理 (3)
- 日志 (2)
- 微信公众号 (2)
- IDEA (1)
- 保存他人遇到的问题 (1)
- webservice (11)
- memcached (3)
- nginx (6)
- 抓包 (1)
- java规范 (1)
- dubbo (3)
- xwiki (1)
- quartz (2)
- 数字证书 (1)
- spi (1)
- 学习编程 (6)
- dom4j (1)
- 计算机系统知识 (2)
- JAVA系统知识 (1)
- rpcf (1)
- 单元测试 (2)
- php (1)
- 内存泄漏cpu100%outofmemery (5)
- zero_copy (2)
- mac (3)
- hive (3)
- 分享资料整理 (0)
- 计算机网络 (1)
- 编写操作系统 (1)
- springboot (1)
最新评论
-
masuweng:
亦论一次OutOfMemoryError的定位与解错 -
变脸小伙:
引用[color=red][/color]百度推广中运用的技术 ...
Spring 3 mvc中返回pdf,json,xml等不同的view -
Vanillva:
不同之处是什么??
Mybatis中的like查询 -
thrillerzw:
转了。做个有理想的程序员
有理想的程序员必须知道的15件事 -
liujunhui1988:
觉得很有概括力
15 个必须知道的 Java 面试问题(2年工作经验)
源:http://blog.csdn.net/walkerjong/article/details/7839002
评:
前言:
公司最近一个项目用到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
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- spring配置jndi -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jndi_isap</value>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/mybatis-config.xml"></property>
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:com/cosbulk/isap/*/dao/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
<qualifier value="isap"/>
</bean>
<!-- 如果是isap的表,用@Transactional("isap"),如果是smis用 @Transactional("smis")管理事务-->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="basePackage" value="com.cosbulk.isap"></property>
</bean>
<!-- /////////////////////////////////////////////////////////////////////////// -->
<!-- smis数据源 -->
<bean id="smisDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jndi_smis</value>
</property>
</bean>
<bean id="smisSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/mybatis-config.xml"></property>
<property name="dataSource" ref="smisDataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:com/cosbulk/smis/dao/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<bean id="smisTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="smisDataSource" />
<qualifier value="smis"/>
</bean>
<!-- 如果是isap的表,用@Transactional("isap"),如果是smis用 @Transactional("smis")管理事务-->
<tx:annotation-driven transaction-manager="smisTransactionManager" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="smisSqlSessionFactory"/>
<property name="basePackage" value="com.cosbulk.smis"></property>
</bean>
</beans>
在applicationContext.xml文件中,主要配置了数据源和dao接口以及mapper文件相关信息,其他的bean信息在isap-servlet.xml文件中定义。
配置文件: isap-servlet.xml
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
default-autowire="byName">
<span style="color:#FF0000;"><strong><!--排除扫描的包, 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.cosbulk.isap">
<context:exclude-filter type="regex" expression="com.cosbulk.isap.*.*.model"/>
<context:exclude-filter type="regex" expression="com.cosbulk.isap.*.*.dao.*"/>
</context:component-scan>
<context:component-scan base-package="com.cosbulk.smis">
<context:exclude-filter type="regex" expression="com.cosbulk.smis.*.*.model"/>
<context:exclude-filter type="regex" expression="com.cosbulk.smis.*.*.dao.*"/>
</context:component-scan></strong></span>
<mvc:annotation-driven/>
<!--添加拦截器,类级别的处理器映射 -->
<mvc:interceptors>
<bean class="com.cosbulk.isap.common.interceptor.CheckLoginInterceptor" />
</mvc:interceptors>
<!-- 支持文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<!-- <property name="maxUploadSize" value="5000000" /> max size 5M -->
</bean>
<!-- 异常处理 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>errorPages/error</value>
</property>
<property name="defaultStatusCode">
<value>500</value>
</property>
<property name="warnLogCategory">
<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
</property>
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">errorPages/maxUploadExceeded</prop>
</props>
</property>
</bean>
<!-- 视图解析类 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
在这个配置文件里进行了所有的注解(@Controller、@Service等)扫描和mvc相关配置。
事务场景:
Service层通过注解@Transactional注入事务
[java] view plaincopy
@Service
//默认将类中的所有函数纳入事务管理.
@Transactional("isap")
public class UserService{
@Autowired
private UserDao userDao;
/**
* 获取主键id
* @return
*/
public Long getId() {
return userDao.getId();
}
/**
* 编辑用户
* @param user
* @param param
*/
public void updateUser(User user,Map<String,Object> param) {
//编辑用户
userDao.updateUser(user);
//删除原有的用户角色关联
userDao.deleteUserRole(param);
String s = null;
s.getBytes();
//新增用户角色关联
insertUserRole(param);
}
这里用来测试事务回滚
...
}
测试过几次updateUser的调用,事务就是不起作用的,后台log信息如下:
[java] view plaincopy
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
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
DEBUG 2011-09-04 16:19:46,687 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: Committing JDBC Connection [org.apache.commons.dbcp.PoolableConnection@67aece]
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]
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)
[html] view plaincopy
1.root-context.xml
<!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 -->
<context:component-scan base-package="com.kimho">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2、servlet-context.xml:
<!-- 扫描业务组件,让spring不扫描带有@Service注解的类(留在root-context.xml中扫描@Service注解的类),防止事务失效 -->
<context:component-scan base-package="com.kimho">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
我做了相应的修改,把isap-servlet里的bean扫描拆成了两部分,分别放入applicationContext.xml和isap-servlet.xml文件中。
applicationContext.xml中加入:
[html] view plaincopy
<!-- 扫描带有@Service注解的类。 -->
<context:component-scan base-package="com.cosbulk.isap">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<context:component-scan base-package="com.cosbulk.smis">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
isap-servlet.xml文件中,扫描bean部分换成:
[html] view plaincopy
<!--排除扫描的包, 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.cosbulk.isap">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
<context:component-scan base-package="com.cosbulk.smis">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</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等)。
评:
前言:
公司最近一个项目用到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
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- spring配置jndi -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jndi_isap</value>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/mybatis-config.xml"></property>
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:com/cosbulk/isap/*/dao/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
<qualifier value="isap"/>
</bean>
<!-- 如果是isap的表,用@Transactional("isap"),如果是smis用 @Transactional("smis")管理事务-->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<property name="basePackage" value="com.cosbulk.isap"></property>
</bean>
<!-- /////////////////////////////////////////////////////////////////////////// -->
<!-- smis数据源 -->
<bean id="smisDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jndi_smis</value>
</property>
</bean>
<bean id="smisSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/mybatis-config.xml"></property>
<property name="dataSource" ref="smisDataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:com/cosbulk/smis/dao/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<bean id="smisTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="smisDataSource" />
<qualifier value="smis"/>
</bean>
<!-- 如果是isap的表,用@Transactional("isap"),如果是smis用 @Transactional("smis")管理事务-->
<tx:annotation-driven transaction-manager="smisTransactionManager" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="smisSqlSessionFactory"/>
<property name="basePackage" value="com.cosbulk.smis"></property>
</bean>
</beans>
在applicationContext.xml文件中,主要配置了数据源和dao接口以及mapper文件相关信息,其他的bean信息在isap-servlet.xml文件中定义。
配置文件: isap-servlet.xml
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
default-autowire="byName">
<span style="color:#FF0000;"><strong><!--排除扫描的包, 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.cosbulk.isap">
<context:exclude-filter type="regex" expression="com.cosbulk.isap.*.*.model"/>
<context:exclude-filter type="regex" expression="com.cosbulk.isap.*.*.dao.*"/>
</context:component-scan>
<context:component-scan base-package="com.cosbulk.smis">
<context:exclude-filter type="regex" expression="com.cosbulk.smis.*.*.model"/>
<context:exclude-filter type="regex" expression="com.cosbulk.smis.*.*.dao.*"/>
</context:component-scan></strong></span>
<mvc:annotation-driven/>
<!--添加拦截器,类级别的处理器映射 -->
<mvc:interceptors>
<bean class="com.cosbulk.isap.common.interceptor.CheckLoginInterceptor" />
</mvc:interceptors>
<!-- 支持文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<!-- <property name="maxUploadSize" value="5000000" /> max size 5M -->
</bean>
<!-- 异常处理 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>errorPages/error</value>
</property>
<property name="defaultStatusCode">
<value>500</value>
</property>
<property name="warnLogCategory">
<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
</property>
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">errorPages/maxUploadExceeded</prop>
</props>
</property>
</bean>
<!-- 视图解析类 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
在这个配置文件里进行了所有的注解(@Controller、@Service等)扫描和mvc相关配置。
事务场景:
Service层通过注解@Transactional注入事务
[java] view plaincopy
@Service
//默认将类中的所有函数纳入事务管理.
@Transactional("isap")
public class UserService{
@Autowired
private UserDao userDao;
/**
* 获取主键id
* @return
*/
public Long getId() {
return userDao.getId();
}
/**
* 编辑用户
* @param user
* @param param
*/
public void updateUser(User user,Map<String,Object> param) {
//编辑用户
userDao.updateUser(user);
//删除原有的用户角色关联
userDao.deleteUserRole(param);
String s = null;
s.getBytes();
//新增用户角色关联
insertUserRole(param);
}
这里用来测试事务回滚
...
}
测试过几次updateUser的调用,事务就是不起作用的,后台log信息如下:
[java] view plaincopy
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
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
DEBUG 2011-09-04 16:19:46,687 org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl: Committing JDBC Connection [org.apache.commons.dbcp.PoolableConnection@67aece]
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]
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)
[html] view plaincopy
1.root-context.xml
<!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 -->
<context:component-scan base-package="com.kimho">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2、servlet-context.xml:
<!-- 扫描业务组件,让spring不扫描带有@Service注解的类(留在root-context.xml中扫描@Service注解的类),防止事务失效 -->
<context:component-scan base-package="com.kimho">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
我做了相应的修改,把isap-servlet里的bean扫描拆成了两部分,分别放入applicationContext.xml和isap-servlet.xml文件中。
applicationContext.xml中加入:
[html] view plaincopy
<!-- 扫描带有@Service注解的类。 -->
<context:component-scan base-package="com.cosbulk.isap">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<context:component-scan base-package="com.cosbulk.smis">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
isap-servlet.xml文件中,扫描bean部分换成:
[html] view plaincopy
<!--排除扫描的包, 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.cosbulk.isap">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
<context:component-scan base-package="com.cosbulk.smis">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</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等)。
发表评论
-
使用Spring+Junit+Mockito做代码自测
2019-05-29 15:27 510源:https://blog.csdn.net/z19917 ... -
在同一个类中调用另一个方法没有触发 Spring AOP 的问题
2017-08-24 17:22 575源:https://segmentfault.com/a/11 ... -
MyBatis排序时施用orderby动态参数时需要注意,用$而不是#
2016-08-10 18:24 936源:http://www.makaidong.com/%E6% ... -
Spring Transaction属性之Propagation
2016-08-10 17:09 548源:http://blog.csdn.net/kiwi_cod ... -
循环依赖检测方法 spring源码方法
2016-07-06 18:58 1167场景:checkForAliasCircle(name, al ... -
Spring的Quartz定时器同一时刻重复执行二次的问题解决
2016-03-11 18:27 1004源:http://www.linuxidc.com/Linux ... -
spring factory-method
2016-03-01 11:22 487源:http://blog.sina.com.cn/s/blo ... -
spring中lazy-init详解
2016-02-29 17:01 778源:http://blog.csdn.net/fhx0 ... -
Mybatis中的like查询
2016-01-06 15:30 626源:http://blog.csdn.net/zhang987 ... -
Spring Refresh Application Context
2015-12-13 14:48 861源:http://techdive.in/spring/spr ... -
spring context 扫描与 mvc扫描类 区分开包
2015-07-15 13:23 6111.applicationContext.xml <!- ... -
Filter中注入spring
2015-07-09 10:45 512源:http://zy116494718.iteye.com/ ... -
获取spring的ApplicationContext几种方式
2015-06-24 15:35 698源:http://blog.sina.com.cn/s/blo ... -
spring获取webapplicationcontext,applicationcontext几种方法详解
2015-04-02 16:38 466源:http://www.blogjava.net/Todd/ ... -
REGISTRY KEY 'SOFTWARE\JAVASOFT\JAVA RUNTIME ENVIRONMENT\CURRENTVERSION'错误
2015-01-21 20:17 590源:http://www.blogjava.net/tomor ... -
context:component-scan扫描使用上的容易忽略的use-default-filters
2014-12-29 21:29 450源:http://jinnianshilongnian.ite ... -
Spring线程池开发实战
2014-12-12 10:44 499源:http://blog.csdn.net/chszs/ar ... -
mybatis xml写动态 sql where set 自动去除 , and/or
2014-11-24 15:19 1916源:http://limingnihao.iteye.com/ ... -
org.apache.coyote.AbstractProtocol pauseTomcat进程意外退出的问题分析
2014-11-20 16:21 1720源:http://ifeve.com/why-kill ... -
从IBatis2.X 移植到IBatis3.0 sqlMapConfig and sqlMap XML 配置文件升级说明
2014-11-06 17:20 858源:https://code.google.com/p/myb ...
相关推荐
SSM整合指的是Spring、SpringMVC和MyBatis三个开源框架的集成,它们共同构建了一个强大的Java Web开发解决方案。在Java后端开发中,SSM框架因其灵活性、可扩展性和良好的社区支持而广受欢迎。接下来,我们将深入探讨...
这三个框架各自解决不同的问题,但结合在一起能提供一个完整的Java Web应用解决方案。 1. **Spring**:是一个轻量级的Java开发框架,它主要提供了依赖注入和面向切面编程等功能,极大地简化了Java企业级应用的开发...
Spring框架是Java开发中不可或...总结来说,Spring框架提供了全面的解决方案,涵盖了Web应用的各个方面,包括控制层、数据访问层、事务管理、缓存等。了解并熟练掌握这些知识点对于成为一名专业的Java开发者至关重要。
【SSM社区疫情联防联控系统】是一个综合性的信息技术解决方案,主要应用于社区对新冠疫情的防控工作。系统采用Java技术栈,结合Spring、SpringMVC和MyBatis(SSM框架)进行开发,同时整合了SpringBoot框架以提高开发...
8. **MyBatis面试题**:MyBatis是一个优秀的持久层框架,面试中可能会讨论动态SQL、映射文件、事务管理、缓存机制以及MyBatis与Spring的整合使用。 这些面试题的涵盖范围广泛,旨在考察候选人的理论知识、实践经验...
15. **分布式系统**:CAP理论,分布式锁,负载均衡,分布式缓存(Redis,Memcached),消息队列(RabbitMQ,Kafka),以及分布式事务的解决方案。 以上就是Java面试中可能涉及的主要知识点,每个主题都包含了大量的...
最后,对于企业级应用,Spring框架的使用越来越普遍,它的依赖注入、AOP(面向切面编程)、MyBatis整合、Spring Boot、Spring Cloud等相关知识也是面试中不可或缺的部分。 总的来说,这份2017版的Java面试题汇总...
总的来说,基于SSM的防疫信息登记系统是利用现代Java技术实现的信息化解决方案,它有效整合了前后端资源,提高了防疫工作的效率和准确性。对于学习和理解Java Web开发,以及如何构建实用的防疫信息系统,都有很高的...
这个系统旨在为高校提供一套有效的疫情监控和管理解决方案。 【SSM框架详解】 1. Spring:这是一个全面的Java企业级应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)以及事务管理等功能,简化了开发过程。...
无纸化考试模拟系统是一种利用现代信息技术,实现线上考试、成绩管理、学生信息管理的教育信息化解决方案。本系统基于Spring、SpringMVC和MyBatis(SSM)框架,结合MySQL数据库,构建了一个高效、稳定且易于维护的...
17. Dubbo配置文件如何加载到Spring中:通过XML配置或注解方式将Dubbo配置整合到Spring应用中。 以上所述知识点仅是文档中提及的一部分,面试题通常还会包含更多细节和深入理解的内容,掌握这些知识点对于Java...
- **Spring框架**:用于企业级应用的全面解决方案,包括依赖注入、事务管理、AOP等。 - **Hibernate**或MyBatis:作为ORM(对象关系映射)工具,简化数据库操作。 - **Servlet和JSP**:处理HTTP请求,构建动态网页。...
计算机图书管理系统是一个典型的信息化解决方案,它整合了图书的采购、分类、借阅、归还以及库存管理等多个环节,旨在提高图书馆的工作效率和服务质量。在这个压缩包文件“计算机图书管理系统.zip”中,我们可以推测...