快速业务通道

如何使用Eclipse CNF的Saveable Protocol实现对View的保存 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
都必须 new 一个新的实例。传统的 Service 由于将有状态的 DAO 作为成员变量,所以传统的 Service 本身也是有状态的。

但是在 Spring 中,DAO 和 Service 都以单实例的方式存在。Spring 是通过 ThreadLocal 将有状态的变量(如 Connection 等)本地线程化,达到另一个层面上的“线程无关”,从而 实现线程安全。Spring 不遗余力地将状态化的对象无状态化,就是要达到单实例化 Bean 的目 的。

由于 Spring 已经通过 ThreadLocal 的设施将 Bean 无状态化,所以 Spring 中单实例 Bean 对线程安全问题拥有了一种天生的免疫能力。不但单实例的 Service 可以成功运行于多 线程环境中,Service 本身还可以自由地启动独立线程以执行其它的 Service。下面,通过一 个实例对此进行描述:

清单 13 UserService.java 在事务方法中启动独立线程运行另一个事务方法

@Service("userService") public class UserService extends BaseService {    @Autowired    private JdbcTemplate jdbcTemplate;    @Autowired    private ScoreService scoreService;    //① 在logon方法体中启动一个独立的线程,在该独立的线程中执行 ScoreService#addScore()方法    public void logon(String userName) {      System.out.println("logon method...");      updateLastLogonTime(userName);      Thread myThread = new MyThread(this.scoreService,userName,20);      myThread.start();    }    public void updateLastLogonTime(String userName) {      System.out.println("updateLastLogonTime...");      String sql = "UPDATE t_user u SET u.last_logon_time = ? WHERE  user_name =?";      jdbcTemplate.update(sql, System.currentTimeMillis(), userName);    }    //② 封装ScoreService#addScore()的线程     private class MyThread extends Thread{      private ScoreService scoreService;      private String userName;      private int toAdd;      private MyThread(ScoreService scoreService,String userName,int  toAdd) {        this.scoreService = scoreService;        this.userName = userName;        this.toAdd = toAdd;      }      public void run() {        scoreService.addScore(userName,toAdd);      }    } }

Spring事务管理高级应用难点剖析,第1部分(12)

时间:2012-04-26 IBM 陈雄华

将日志级别设置为 DEBUG,执行 UserService#logon() 方法,观察以下输出的日志:

清单 14 执行日志

[main] (AbstractPlatformTransactionManager.java:365) - Creating new  transaction with name    [user.multithread.UserService.logon]:  PROPAGATION_REQUIRED,ISOLATION_DEFAULT ①  [main] (DataSourceTransactionManager.java:205) - Acquired Connection    [org.apache.commons.dbcp.PoolableConnection@1353249] for JDBC  transaction logon method... updateLastLogonTime... [main] (JdbcTemplate.java:785) - Executing prepared SQL update [main] (JdbcTemplate.java:569) - Executing prepared SQL statement    [UPDATE t_user u SET u.last_logon_time = ? WHERE user_name =?] [main] (JdbcTemplate.java:794) - SQL update affected 0 rows [main] (AbstractPlatformTransacti

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号