熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

如何提高Hibernate 3 啟動速度

2013-11-23 20:10:16  來源: Java開源技術 
   在Tomcatx環境下調用Configuration()addCacheableFile來載入配置建立Hibernate SessionFactory成功地提高了載入速度

   推薦你只是在開發階段采用這樣的方式載入最後的產品發布階段你仍需使用經典的Hibernatecfgxml文件通過Tomcat的ServletContextListener API在應用程序部署的時候建立Hibernate SessionFactory而不是在程序第一次調用Hiberante的時候

文件

net/netbauds/catalina/IHibernateCachableFileLoadjava

這個文件可以在不同的web應用中使用而不用作任何修改

package  baudscatalina;

import  orghibernatecfgConfiguration;

public   interface  IHibernateCachableFileLoad {

     public   void  addMappings(Configuration conf);

}

  net/netbauds/catalina/HibernateSessionFactoryjava

使用靜態方法HibernateSessionFactorygetSessionFactory() 來代替我們以前使用的Configuration(nfigure()buildSessionFactory()這個方法一般在你的HibernateSession單態類中(參考)

這個文件也可以在不同的應用中使用而不加任何修改


package  baudscatalina;

import  orghibernateSessionFactory;
import  orghibernatecfgConfiguration;

//  單態的 sessionFactory
public   class  HibernateSessionFactory {
     private   static  SessionFactory sessionFactory;

     public   static  SessionFactory getSessionFactory() {
         //  不要從 JNDI中獲取SessionFactory 使用一個靜態的 SessionFactory
         if  (sessionFactory  ==   null ) {
            Configuration conf  =   new  Configuration();

             try  {

                Class klass  =  ClassforName( configHibernateCachableFileLoad );

                IHibernateCachableFileLoad hibConf  =  (IHibernateCachableFileLoad) klassnewInstance();

                hibConfaddMappings(conf);

            }  catch  (ClassNotFoundException e) {
                 //  NOOP
            }  catch  (InstantiationException e) {
                 //  NOOP
            }  catch  (IllegalAccessException e) {
                 //  NOOP
            }
 
            Configuration confdone  =  nfigure();

             if (confdone  !=   null ) {
                 //  Use default hibernatecfgxml
                sessionFactory  =  confdonebuildSessionFactory();
            }
        }

         return  sessionFactory;
    }
}


  config/HibernateCachableFileLoadjava

這個文件是隨web應用的不同而不同的你需要修改代碼中的某些部分使其適合你的應用應該有人知道如何更容易的由class loader獲得WEBINF/classes的絕對路徑吧這裡我只是把它直接寫入了程序中

你需要修改如下部分

* 將你所有的Hibernate映射配置文件(*hbmxml)加入到程序中(正如你在Hibernatecfgxml中所做的)


package  config;

import  baudscatalinaIHibernateCachableFileLoad;
import  orghibernatecfgConfiguration;

//  This class is webapp specific and allow loading of mapping via
//   addCachableFile();
public   class  HibernateCachableFileLoad  implements  IHibernateCachableFileLoad {

     public   void  addMappings(Configuration conf) {

        doFile(conf  com/mydomain/MyClassFilehbmxml );

        doFile(conf  com/mydomain/MyClassFilehbmxml );

    }

     private   void  doFile(Configuration conf String resPath) {

        String path  =   null ;

        URL u  =   this getClass()getClassLoader()getResource(resPath);

         if (u  !=   null ) {

            path  =  ugetFile();
             if (path  !=   null )
                conf  =  confaddCacheableFile(path);
        }

         if (path  ==   null   ||  conf  ==   null )
            Systemerrprintln( ERROR: Failed to load:    +  resPath);
    }
}

hibernatecfgxml

這將使我們標准的hibernatecfgxml發生一些變化如果你使用的是hibernateconfigurationdtd(版本)那麼你可以不寫入任何mapping元素

如果你使用的是老版本的dtd那麼你需要在hibernatecfgxml中寫入一個mapping元素

  An alternative way maybe to programatically configure the connectiondatasource in the HibernateSessionFactory() above and maybe hibernate will allow you to do away with looking and parsing the hibernatecfgxml completely and build a working factory with the Configuration you have programatically created

一個可供選擇的方法是使用編寫java代碼的方式來配置上面的SessionFactory的connectiondatasource也許Hibernate將允許你讀取hibernatecfgxml文件並且是用你在程序中創建的Configuration來建立一個sessionFactory

你需要作如下修改

  * 將 java:comp/env/jdbc/ConfigureMeDS 修改為你自己的數據庫連接信息

那麼現在


    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="connection.datasource">java:comp/env/jdbc/ConfigureMeDSproperty>

        
        
    session-factory>
hibernate-configuration>

如果你使用的Hibernate版本需要在hibernate.cfg.xml中至少有一個mapping元素,那麼你可能需要用到下面的兩個文件,否則,如上就可以了。Tw.WiNGwit.com

  uk/mydomain/Dummy.hbm.xml


          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="uk.mydomain.Dummy" table="dummy">
       <id name="id" type="long" column="id">
           <generator class="native" />
       id>
    class>
hibernate-mapping>

uk/mydomain/Dummy.java


package uk.mydomain;

public class Dummy {
    private long id;
    private long getId() {
        return id;
    }

    private void setId(long id) {
        this.id = id;
    }
}

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28058.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.