`
zhongxiucheng
  • 浏览: 70864 次
  • 性别: 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 MVC+ SOCKET 返回语音提醒

    在这个"Spring MVC+ SOCKET 返回语音提醒"的示例中,我们将探讨如何结合这两者实现订单或即时通知的语音提醒功能。 首先,Spring MVC在Web应用中的作用是作为控制器层,负责接收客户端请求,调用业务逻辑,然后返回...

    IDEA社区版SpringBoot插件Spring Assistant

    6. **版本更新提示**:自动检测Spring Boot及相关依赖库的版本更新,提醒开发者保持项目与时俱进。 7. **代码质量检查**:集成了一些基本的代码质量检查工具,如Lombok、Checkstyle等,帮助开发者提升代码质量。 ...

    综合spring mvc + spring + hibernate + bootstrap开发图书管理系统

    7. **任务调度**:使用Quartz或Spring Task进行定时任务,如自动提醒借阅到期的用户。 8. **邮件服务**:集成SMTP发送邮件通知,如注册验证、借阅提醒等。 9. **报表生成**:如使用JasperReports或iText生成统计报告...

    第一个spring程序

    描述 "spring第一个测试程序,直接用就行了" 提醒我们这是一个用于测试的简单Spring程序,意味着它可能包含了配置文件、主类以及一些基本的测试用例。在Spring中,通常我们会创建一个`ApplicationContext`来加载配置...

    spring 3.0.5 + jotm 实现的的spring mvc 的例子

    标题中的“spring 3.0.5 + jotm 实现的的spring mvc 的例子”表明这是一个关于使用Spring 3.0.5版本与...同时,它也提醒我们,随着技术的更新迭代,保持项目依赖的最新状态是十分重要的,以便利用新功能和安全改进。

    spring源码报错缺失的两个包

    2. `spring-objenesis-repack-2.4.jar`: Objenesis是一个非常小且快速的库,用于在没有构造函数的情况下创建Java对象,这在一些特殊场景下非常有用,比如测试和模拟。在Spring框架中,Objenesis与CGlib一起工作,...

    spring mail

    Spring Mail 是一个在Java应用程序中发送电子邮件的库,它与流行的Spring框架紧密集成,使得邮件发送功能的实现变得更加简单和灵活。Spring Mail 提供了一种优雅的方式来配置和使用JavaMail API,而无需直接处理复杂...

    spring.zip

    《Spring框架结合EasyUI构建的信息管理系统详解》 在IT行业中,Spring框架与EasyUI的结合是构建...同时,该项目也提醒我们在实际工作中,应重视数据库设计、前后端分离、权限控制等方面,以确保系统的稳定性和安全性。

    Spring与memcached整合

    标签“源码”意味着我们可能需要查看具体的代码实现来理解整合过程,而“工具”则提醒我们关注实际开发中可能使用的辅助工具或库。在实践中,除了spymemcached或xmemcached之外,还有其他的memcached客户端库可供...

    3.2版本Spring源码需要源码所需要的jar:spring-asm-repack-5.0.4.jar,spring-cglib-repack-3.1.jar

    在IT行业中,Spring框架是Java开发中的一个核心组件,它为构建企业级...同时,这也提醒我们,无论是在日常开发还是学习中,掌握如何管理和使用库文件,尤其是对于开源项目,都是提升开发效率和解决问题能力的重要一环。

    spring定时器

    Spring 定时器是Spring框架提供的一种方便、高效的定时任务处理机制,主要用于执行周期性的后台任务,如定时发送邮件、短信提醒、数据同步等。Spring 定时器支持多种定时方式,包括基于注解的方式和非注解的方式。 ...

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

    【作品名称】:基于 Java+Mysql 实现的图书管理系统( Spring+Spring MVC+JdbcTemplate) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项...

    Quartz触发器的使用DEMO(Spring实现)

    Quartz是一款开源的作业调度框架,它允许开发者在应用程序中安排...例如,可以设置每日凌晨备份数据库、定期发送邮件提醒、定时执行统计分析等。同时,Quartz还支持集群部署,能确保在多台服务器环境下任务的高可用性。

    狂神说Spring笔记及代码

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

    spring各种邮件发送

    在IT行业中,Spring框架是Java开发中的一个关键组件,它提供了丰富的功能,包括但不限于依赖注入、面向切面编程以及各种企业级服务。在"spring各种邮件发送"这个主题中,我们将探讨Spring框架如何帮助开发者实现电子...

    spring示例2

    同时,提醒读者“下载记得加载jar包,包在第一篇里有”,意味着这个示例需要依赖某些外部库,这些库的jar包已经在前一篇博客提供的资源中包含,这强调了在实际运行项目时正确设置依赖的重要性。 在“标签”中,...

    spring-framework-4.3.6.RELEASE-文档&约束

    它提醒用户注意可能存在其他许可条件的库,确保用户在使用Spring时同时遵守这些库的许可规定。 4. **docs**:这是文档目录,包含了Spring框架的详细技术文档。文档可能包括用户指南、开发者参考、API文档和各种教程...

    SPRING_SECURITY_THIRD_EDITION

    最后,这本书也提到了在生产环境中使用Spring Security的一些最佳实践。包括如何配置Spring Security来满足特定的安全需求,如何为应用程序添加额外的安全层以及如何处理常见的安全威胁等。书中还提到了如何与Spring...

    Spring Security3.1实例

    timeout.jsp可能是一个会话超时后用户被重定向到的页面,提醒用户重新登录。 5. **配置文件**:在WEB-INF目录中,通常会包含web.xml和spring-security.xml等配置文件。web.xml用于配置Spring Security拦截器,而...

    spring3.0学习

    标签 "源码" 提醒我们关注Spring 3.0的内部结构和设计。深入理解Spring源码有助于开发者更好地定制和优化应用程序。Spring的模块化设计,如Core Container、Data Access/Integration、Web和AOP等,使得我们可以按需...

Global site tag (gtag.js) - Google Analytics