1、通过ApplicationContext的getBean方法返回的class只能用接口去转型(因为他是一个代理),当然如果你定义的类本身不继承任何接口的话,那么你就杯具了。
2、@Transactional这个事务标记,必须标记在service的入口方法处,否则不会生效的,一下几种情况,不会生效:
a、入口方法没有标记@Transactional,但是入口方法调用本类的私有方法,该私有方法标记了@Transactional
b、入口方法没有标记@Transactional,但是入口方法调用本类的共有方法,该共有方法标记了@Transactional,此处共有方法不论是否在接口中有定义都是一样的效果
因为@Transactional默认采用的是AOP机制,当他基于spring自动生成的代理调用时,方才能够生效,所以上面几种情况不能够生效,也就可以理解了,所以要能够使@Transactional标记生效一般都是这样子调用的someService.someMethod()(someService最终会调用相应代理类的someMethod方法),someMethod上面标记@Transactional
附:如果想使类中的私有方法以及方法内部之间的相互调用都能够让@Transactional生效的话,至少有两种方法可以解决:
1) 将spring管理的自身类的实例注入到自己的类中,俗称自己注入自己,常见的是使用factory-method来管理本类的实例。
2)使用aspectJ,这是spring的一项高级技术,我也不太懂,好像要对字节码进行修饰,但是确实是可以的,这也是spring推荐使用的解决方案,不过本人更倾向于第一种。
3、@Transactional标记会在方法执行完毕后才会commit。一般情况,程序执行到哪里的时候,抛出异常,回滚前面的操作就可以了,但是某些数据库异常却是在commit的时候抛出来的,这时我们就要注意了,不仅需要回滚抛出异常之前的代码,整个程序都需要进行回滚,注意如下代码:
@Transactional
public void oneMethod() {
someJdbcOprate();//插入数据库操作
insertSomeToMem();//插入某数据到内存中
}
注意这个方法,我们预想someJdbcOprate方法抛出异常后,就不会执行insertSomeToMem这个方法了,但实际可能并非如此,如果在事务commit时,抛出了某个数据库异常,则insertSomeToMem已经执行,且他执行的操作是没法回滚的,所以在使用@Transactional标记时,一定要清楚程序可能抛出的数据库异常,否则就可能出现问题。那么,有哪些情况是在事务commit的时候抛出数据库异常呢,请看如下情况:
a、插入的值的长度大于数据库对应的列的长度。例如数据库中某一列长度是40个字符,可是你却插入了50个字符,此时在事务未提交之前是不会抛出异常的,只有在commit的时候才会抛出异常(java.sql.BatchUpdateException: ORA-01438: 值大于为此列指定的允许精度)
b、插入了一个不存在的列的值。例如你想把“abc”插入表person中的name列,可是表person并没有name列,此时在事务内不会抛异常,也只有在方法结束commit的时候抛出异常。
c、数据库中某列是一个不能为空的列,且在hbm中未设置改列的属性not-null="true",向该列插入了某个空值。此种情况也是在commit的时候抛出数据库异常。
d、对于unique index,也会产生同样的问题。即数据库中某列标记为了unique index,并且存在某个值x,再次向该列插入值x,此时也不会在transactional内抛异常,也是在commit的时候抛的数据库异常。
附:慎用spring的@Transactional标记。在@Transactional里面尽量只有数据库操作。
注意:要解决以上问题,请具体参考我的另外一篇日志:spring+hibernate事务中无法即时使数据库检查约束的终极解决方案
4、在标记了@Transactional标记的方法中再次调用某个service的标记了@Transactional方法,则后面这个@Transactional会被忽略,这个commit和回滚以最外层的标记了@Transactional的方法为准。
5、@Transactional标记默认会在用户自定义的advice(就是自定义切面)之外执行,具体见图:
所以此时,想让自定义的aop能捕获@Transactional标记在commit时抛出的异常,需要在aop和<tx:annotation-driven />中设置属性order,通常order值越大,离业务方法越近,order值越小离方法越远(跟穿衣服一样,order值小的就只能位于最外面一层了),所以要捕获@Transactional方法抛出的异常,需要设置自己捕获异常的aop的order值比<tx:annotation-driven/>中的order值小。
6、当使用spring+hibernate时,配置了session和当前线程(ThreadLocal)绑定,即在xml中配置了:
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value><!--当为true的时候,整个请求使用同一个session(可能引发其他问题),当为false时,每一次dao请求即会产生一个session-->
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如上配置,这样子,每个session的生命周期为,dao请求发起——>OpenSessionInViewFilter拦截器结束(即用户线程请求完毕),如果在一次请求的过程中,调用了多次dao,即生成多个session,我们知道一个session对应一个链接,这样子本次用户请求就可能占用多个数据库链接,当占用的链接数等于了datasource的maxactive的值的时候,其他用户再发起请求就会出现获取不到数据库链接的异常,因此,我们必须保证每个业务方法请求dao的次数尽量小于maxactive的值,实际上应该远远小于,而且尽可能将maxactive的值配置大一点。此种情况下maxactive的值也影响系统的并发数。
当然,也可以将singleSession的值配置为true,但是这样子可能引发一些潜在的问题。
分享到:
相关推荐
自学java的同行们应该都知道或者听说过狂神,人如其名!本人在学习java的时候也是看的狂神视频,确实讲的不错,系统的讲述了spring的使用。...最后一个小小的提醒:关注博主不迷路,感谢大家厚爱(手动比心心)
基于Spring+Spring MVC(Maven方式构建) 项目简介 本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,...
This is a reminder for how to using spring.In idea:这个是所有模块的父pom先在idea中新建一个maven module,这个要作为project的首个module来创建。将pom.xml的package改为pom,删除对应的src等目录,只保留pom....
公告管理:公告未读提醒、发布公告、查询公告、公告阅读人列表 excel下载:自定义sql导出excel、也可在页面展示sql结果数据 字典管理:一些常量字典的维护 个人信息修改 修改密码 头像修改 其他说明: 日志...
WEB端语音提醒示例。使用订单或者即使通知类的提醒。例如美团订单、百度订单,你有一个新的订单请及时处理
用户会员中心:SVIP与VIP,定时任务/RabbitMQ延迟队列/登录验证三种判定会员截止时间到期用邮箱去提醒 用户支付中心:我的钱包和支付宝支付以及打印我的账单,内网穿透获得异步通知作为结果判定标志,原始支付的普通...
本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能。 仅供学习...
Spring-websocket ...本项目基于Spring平台,整合websocket协议,实现一个简易web聊天室的...5.添加好友上线提醒和下线提醒的功能,当有好友上线或下线时自动通知所有其他在线人,不要刷新页面可看到实时在线用户列表。
DWR实现的新消息定时提醒 实现了一个页面新消息提示的功能 定时获取后台给当前用户的消息条数 具体的消息提示,用户ID传入,省略了
上下线提醒 在线/隐身 单聊/群聊的离线消息签收 管理端 查看用户/群聊的聊天记录 重置用户密码 禁用用户(强制下线) 基于LayIM、Netty、Spring Boot 实现的在线聊天系统,web网络开发,可内嵌于自己的B/S...
良心demo,可以再学习的过程中参考一下,官网的教程是真的需要好好琢磨的,这个可以作为辅助参考,demo采用的版本均为最新版本:springcloud2.0-Finchley.SR1版本,大神提醒我一句学习springcloud不要想的太复杂,...
最近公司在做一个定时任务,前期采用spring自带的schedule。 场景:添加日程提醒功能。需要进行动态刷新定时任务。因为以前公司都是使用第三方, 比如xxl-job。所有有点不熟悉schedule.参考了网上一些相关资料。写了...
本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap ## 功能介绍 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能 ## 部署描述 ...
前台使用Vue+Vuetify,后端使用Spring Boot+Spring Cloud+Mybatis开发,使用Jwt做登录验证,使用ElasticSearch作为动态和音乐的检索服务,使用RabbitMQ作为服务间消息传递服务,使用RabbitMQ+Stomp.js实现后端和前端...
用了zookeeper的功能加架构的一个JAVA语言系统,采用关系型数据库管理订单,车票,车站,用户管理通过三级关联...画面设计上采用目前很受欢迎的前端框架Bootstrap,外接百度地图和QQ邮箱,具有准时提醒和准确定位等功能
用spring实现了定时发送邮件,无需复杂的代码
#### 基于Spring+Spring MVC(Maven方式构建) [ ### 项目简介 本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 ### 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删...
图书管理系统,本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能...
最近在所项目用到了spring,顺便从官网上下载了Spring(spring2.5、spring3.0)版本的源代码在这里与大家分享。 提醒:里面是jar压缩包,你可以通过eclipse与之关联,也可以直接解压!
本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能。