快速业务通道

Spring事务管理高级应用难点剖析: 第3部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
通过调用 jdbcTemplate.getDataSource().getConnection()显式获 取一个连接,这个连接不是 logon() 方法事务上下文线程绑定的连接,所以如果开发者如果没 有手工释放这连接(显式调用 Connection#close() 方法),则这个连接将永久被占用(处于 active 状态),造成连接泄漏!下面,我们编写模拟运行的代码,查看方法执行对数据连接的 实际占用情况:

清单 2.JdbcUserService.java:模拟运行代码

… @Service("jdbcUserService")  public class  JdbcUserService {   …   //①以异步线程的方式执行 JdbcUserService#logon()方法,以模拟多线程的环境   public static void  asynchrLogon(JdbcUserService userService, String userName) {      UserServiceRunner runner = new UserServiceRunner(userService, userName);     runner.start();   }   private static class  UserServiceRunner extends Thread {     private JdbcUserService  userService;     private String userName;     public  UserServiceRunner(JdbcUserService userService, String userName) {        this.userService = userService;       this.userName =  userName;     }     public void run() {        userService.logon(userName);     }   }   //② 让主执 行线程睡眠一段指定的时间   public static void sleep(long time) {     try {       Thread.sleep(time);     } catch  (InterruptedException e) {       e.printStackTrace();     }   }  //③ 汇报数据源的连接占用情况    public static  void reportConn(BasicDataSource basicDataSource) {      System.out.println("连接数[active:idle]-[" +        basicDataSource.getNumActive()+":"+basicDataSource.getNumIdle()+"]");   }   public static void main(String[] args) {      ApplicationContext ctx =       new ClassPathXmlApplicationContext ("user/connleak/applicatonContext.xml");     JdbcUserService userService  = (JdbcUserService) ctx.getBean("jdbcUserService");      BasicDataSource basicDataSource = (BasicDataSource) ctx.getBean ("dataSource");  //④汇报数据源初始连接占用情况       JdbcUserService.reportConn(basicDataSource);      JdbcUserService.asynchrLogon(userService, "tom");      JdbcUserService.sleep(500);     //⑤此时线程A正在执行 JdbcUserService#logon()方法     JdbcUserService.reportConn (basicDataSource);     JdbcUserService.sleep(2000);     // ⑥此时线程A所执行的JdbcUserService#logon()方法已经执行完毕      JdbcUserService.reportConn(basicDataSource);      JdbcUserService.asynchrLogon(userService, "john");      JdbcUserService.sleep(500);  //⑦此时线程B正在执行 JdbcUserService#logon()方法     JdbcUserService.reportConn (basicDataSource);     JdbcUserService.sleep(2000);  // ⑧此时线程A和B都已完成JdbcUserService#logon()方法的执行       JdbcUserService.reportConn(basicDataSource);   }

Spring事务管理高级应用难点剖析: 第3部分(3)

时间:2012-04

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号