`
zhongxiucheng
  • 浏览: 68598 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring的一些提醒

 
阅读更多

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,但是这样子可能引发一些潜在的问题。

分享到:
评论

相关推荐

    狂神说Spring笔记及代码

    自学java的同行们应该都知道或者听说过狂神,人如其名!本人在学习java的时候也是看的狂神视频,确实讲的不错,系统的讲述了spring的使用。...最后一个小小的提醒:关注博主不迷路,感谢大家厚爱(手动比心心)

    图书管理系统( Spring+Spring MVC+JdbcTemplate)

    基于Spring+Spring MVC(Maven方式构建) 项目简介 本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,...

    spring-snippets:这是spring使用的提醒

    This is a reminder for how to using spring.In idea:这个是所有模块的父pom先在idea中新建一个maven module,这个要作为project的首个module来创建。将pom.xml的package改为pom,删除对应的src等目录,只保留pom....

    基于Springboot+Mybatis+ SpringMvc+springsecrity+Redis完整网站后台管理系统

    公告管理:公告未读提醒、发布公告、查询公告、公告阅读人列表 excel下载:自定义sql导出excel、也可在页面展示sql结果数据 字典管理:一些常量字典的维护 个人信息修改 修改密码 头像修改 其他说明: 日志...

    Spring MVC+ SOCKET 返回语音提醒

    WEB端语音提醒示例。使用订单或者即使通知类的提醒。例如美团订单、百度订单,你有一个新的订单请及时处理

    基于Vue+SpringCloud博客的设计与实现 有论文

    用户会员中心:SVIP与VIP,定时任务/RabbitMQ延迟队列/登录验证三种判定会员截止时间到期用邮箱去提醒 用户支付中心:我的钱包和支付宝支付以及打印我的账单,内网穿透获得异步通知作为结果判定标志,原始支付的普通...

    java图书管理系统( Spring+Spring MVC+JdbcTemplate).rar

    本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能。 仅供学习...

    Spring整合websocket实现即时通讯聊天室

    Spring-websocket ...本项目基于Spring平台,整合websocket协议,实现一个简易web聊天室的...5.添加好友上线提醒和下线提醒的功能,当有好友上线或下线时自动通知所有其他在线人,不要刷新页面可看到实时在线用户列表。

    DWR实现的新消息定时提醒

    DWR实现的新消息定时提醒 实现了一个页面新消息提示的功能 定时获取后台给当前用户的消息条数 具体的消息提示,用户ID传入,省略了

    基于LayIM、Netty、Spring Boot 实现的在线聊天系统,web网络开发,可内嵌于自己的B/S系统或进行二次迭代

    上下线提醒 在线/隐身 单聊/群聊的离线消息签收 管理端 查看用户/群聊的聊天记录 重置用户密码 禁用用户(强制下线) 基于LayIM、Netty、Spring Boot 实现的在线聊天系统,web网络开发,可内嵌于自己的B/S...

    SpringCloud-Finchley.SR1-Ribbon客户端负载均衡demo

    良心demo,可以再学习的过程中参考一下,官网的教程是真的需要好好琢磨的,这个可以作为辅助参考,demo采用的版本均为最新版本:springcloud2.0-Finchley.SR1版本,大神提醒我一句学习springcloud不要想的太复杂,...

    spring-schedule动态刷新定时任务

    最近公司在做一个定时任务,前期采用spring自带的schedule。 场景:添加日程提醒功能。需要进行动态刷新定时任务。因为以前公司都是使用第三方, 比如xxl-job。所有有点不熟悉schedule.参考了网上一些相关资料。写了...

    基于Spring+Spring的图书管理系统

    本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap ## 功能介绍 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能 ## 部署描述 ...

    springboot项目微服务前台使用Vue+Vuetify,后端使用Spring Boot+Spring Cloud+Myba

    前台使用Vue+Vuetify,后端使用Spring Boot+Spring Cloud+Mybatis开发,使用Jwt做登录验证,使用ElasticSearch作为动态和音乐的检索服务,使用RabbitMQ作为服务间消息传递服务,使用RabbitMQ+Stomp.js实现后端和前端...

    基于spring的智能出行系统

    用了zookeeper的功能加架构的一个JAVA语言系统,采用关系型数据库管理订单,车票,车站,用户管理通过三级关联...画面设计上采用目前很受欢迎的前端框架Bootstrap,外接百度地图和QQ邮箱,具有准时提醒和准确定位等功能

    spring定时发送邮件

    用spring实现了定时发送邮件,无需复杂的代码

    基于java实现的图书管理系统( Spring+Spring MVC+JdbcTemplate)

    #### 基于Spring+Spring MVC(Maven方式构建) [ ### 项目简介 本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 ### 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删...

    servlet 图书管理系统,图书增删改查,技术jetty,spring,spring mvc

    图书管理系统,本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能...

    Spring 2.5、3.0 源代码

    最近在所项目用到了spring,顺便从官网上下载了Spring(spring2.5、spring3.0)版本的源代码在这里与大家分享。 提醒:里面是jar压缩包,你可以通过eclipse与之关联,也可以直接解压!

    基于Spring+Spring MVC的图书管理系统

    本图书管理系统基于spring,spring mvc,数据库为mysql。前端使用了Bootstrap。 系统功能 该系统实现读者和管理员登陆,图书的增删改查,读者的增删改查,借还图书,密码修改,卡号挂失,超期提醒等功能。

Global site tag (gtag.js) - Google Analytics