bean加载lazy-init

首先是找到了hibernate的启动优化 http://www.hibernate.org/194.html  里面的主要思想是通过将xml序列花到本地的
文件里,每次读取的时候根据情况,从本地文件读取并反序列化,节省了hibernate xml的解析时间。按照这个方式测试了
一下,发现hibernate的启动时间从5秒降低到3秒,但是这个优化对于整个启动过程是杯水车薪的,毫无用处。
下面是hibernate的优化代码:


public Configuration addCachableFile(String xmlFile) throws MappingException {       
        try {
            File file = new File(xmlFile);
            File lazyfile = new File(xmlFile + ".bin");
            org.dom4j.Document doc = null;
            List errors = new ArrayList();
            if(file.exists() && lazyfile.exists() && file.lastModified()<lazyfile.lastModified()) {
                log.info("Mapping lazy file: " + lazyfile.getPath());
                ObjectInputStream oip = null;
                oip = new ObjectInputStream(new FileInputStream(lazyfile));
                doc = (org.dom4j.Document) oip.readObject();
                oip.close();
            } else {
                doc = xmlHelper.createSAXReader(xmlFile, errors, entityResolver).read( file );
                log.info("Writing lazy file to " + lazyfile);
                ObjectOutputStream oup = new ObjectOutputStream(new FileOutputStream(lazyfile));
                oup.writeObject(doc);
                oup.flush();
                oup.close();
            }
           
            if ( errors.size()!=0 ) throw new MappingException( "invalid mapping", (Throwable) errors.get(0) );
            add(doc);
            return this;
        }
        catch (Exception e) {
            log.error("Could not configure datastore from file: " + xmlFile, e);
            throw new MappingException(e);
        }
    }

没办法,又仔细查看了spring的资料,终于发现spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy- load,
该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、
到 service配置到dao配置、乃至到数据库连接、事务等等。这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝
试了一下,把beans的 default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常
小一个改动,但是影响确实非常大。一个项目组10个人,假若每个人一天平均需要在eclipse下启动测试服务器50次。那么
一天项目组需要重启500次,每次节省50秒的话,就是 25000秒,将近几个小时,差不多一个工作日,多么可观的数字!


不过在运行期间第一次点页面的时候,由于spring做了lazy-load,现在就需要启动一部分需要的beans,所以稍微慢2-3
  秒钟,但是明显比等几十秒要快很多,值得一鉴。

以上是针对开发阶段的spring容器启动优化,在部署到实际环境中,倒是没必要设置为lazy-load。毕竟部署到实际环境
中不是经常的事,每次启动1分钟倒不是大问题。

我这里要提醒的是不是说有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init


< beans  default-lazy-init ="true" >  
     < bean  class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
         < property  name ="triggers" >
             < list >
                 < ref  bean ="buildHtmlTrigger" />
                 < ref  bean ="askTrigger" />
                 < ref  bean ="mailSenderTrigger" />
                 < ref  bean ="topicDetailBuildTrigger" />
                 < ref  bean ="forumBuildTrigger" />
                 < ref  bean ="topicBuildTrigger" />
             </ list >
         </ property >
     </ bean >
</ beans >
这样的话。所有的scheduler就都不管用了。所以请大家要注意。下面这样才是可以执行的

< beans > 
     < bean  class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
         < property  name ="triggers" >
             < list >
                 < ref  bean ="buildHtmlTrigger" />
                 < ref  bean ="askTrigger" />
                 < ref  bean ="mailSenderTrigger" />
                 < ref  bean ="topicDetailBuildTrigger" />
                 < ref  bean ="forumBuildTrigger" />
                 < ref  bean ="topicBuildTrigger" />
             </ list >
         </ property >
     </ bean >
</ beans >

猜你喜欢

转载自mosquito2a.iteye.com/blog/1912408