在web dynpro7.1中使用Hibernate
1. 簡介
在CE7.1中使用Hibernate跟在7.0中使用基本類似。第一步要建一個lib,用於存放jar包;第二步要建一個j2ee的工程,用於發佈jar包;第三步建使用Hibernate的工程,如web dynpro工程。下面是詳細說明,以及一些抓圖。
2. 第一步建lib工程
1. 創建lib工程(注意:創建的是local的DC)
圖X 新建Local的DC
圖X 新建Local的lib包
2. 將非Hibernate的包(如:hep_tdm_hibernate.jar、deepSOFTcom METHOD.jar)拷貝到libraries目錄下,然後添加到public part下。Public part有兩個:libCom(類型:COMPILATION)、libAss(類型:ASSEMBLY)。
圖X 將lib包添加到Public Part
圖X Public Part設置狀況
3. 第二步建J2EE工程
1. 新建J2EE工程
圖X 新建Loacl的J2EE
圖X 新建Loacl的J2EE
2. 設置J2EE工程屬性
圖X 設置J2EE工程的屬性(鉤上Sap Application Library Container項)
3. 添加Used DC
圖X 添加Used DC
圖X 添加Used DC後設置(libAss和libCom的Build Time項都要鉤上)
4. 新建public part(appCom類型:COMPILATION、appAss類型:ASSEMBLY)
圖X J2EE工程新建pablic part
5. J2EE工程打包以及部署。將Hibernate包手動加入到demo.sap.com~apptesthib.ear文件中
圖X Build工程後生成的ear文件
圖X 將存放Hibernate的lib添加到ear文件中(之後纔可以部署)
圖X lib文件夾下Hibernate包情況
4. 第三步建web dynpro調用工程
1. 建Local的web dynpro工程DC
圖X 新建Local的Web Dynpro工程
2. 添加引用。需要添加lib工程和J2EE工程(如果不添加lib工程,build時build不過去;如果不添加J2EE工程,運行的時候找不到Hibernate)。
圖X 在Used DC中添加lib和j2ee的public part(兩個DC屬性設置一樣)
圖X 設置屬性(所有Public part的Build Time項都要鉤上)
3. 使用Hibernate
現在就可以使用Hibernate了,下面是一段調用例子
try{
HibernateDao myDao = new HibernateDao();
String hSql = "from TdmAudiInfo order by itemNo desc";
List list = myDao.hqlQuery(hSql, null, 0, 5);
if(list==null || list.size()==0)
wdComponentAPI.getMessageManager().reportWarning("no record");
else{
for(int i=0; i<list.size(); i++){
TdmAudiInfo obj = (TdmAudiInfo)list.get(i);
//********************************************
//使用Hibernate對象;
//********************************************
}
}
}catch(Exception ex){
ex.printStackTrace();
}
4. 性能感受
圖X 從數據中查詢10000條記錄並顯示
機器配置:後臺查詢的表有43個字段,字段定義基本是VARCHAR2(254)。數據庫是Oracle10g,存於一臺普通的pc服務器(兩核,3.5G內存)。7.1CE服務器(WAS)是在另一臺PC機器上(P4,2G內存)。
當查詢10000條數據時,用時11秒。時間大部分是用在was服務器讀數據庫上(此時讀的是所有列,顯示到前臺時只有6列)。Table沒有分頁,10000條數據完全顯示,點擊時,響應速度1秒多一點,感覺還可以。
5. 使用感受
在Web Dynpro7.1中使用Hibernate,感覺還是比較好用的。性能方面,因爲hibernate要創建大量的線程,所以每次部署完J2EE工程之後最好能重啓一下WAS,否則可能會報下面的錯誤:
{0}#1#java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:704)
at net.sf.ehcache.store.DiskStore.<init>(DiskStore.java:157)
at net.sf.ehcache.Cache.initialise(Cache.java:269)
at net.sf.ehcache.CacheManager.addCacheNoCheck(CacheManager.java:333)
at net.sf.ehcache.CacheManager.addCache(CacheManager.java:325)
at net.sf.ehcache.CacheManager.addCache(CacheManager.java:310)
at org.hibernate.cache.EhCacheProvider.buildCache(EhCacheProvider.java:104)
at org.hibernate.cache.CacheFactory.createCache(CacheFactory.java:61)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:203)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1152)
at com.hep.tdm.dao.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:61)
at com.hep.tdm.dao.HibernateSessionFactory.getSession(HibernateSessionFactory.java:43)
at com.hep.tdm.dao.HibernateDao.<init>(HibernateDao.java:55)
at com.sap.demo.test.testhibernate.test.TestView.onActionTestHibernate(TestView.java:195)
at com.sap.demo.test.testhibernate.test.wdp.InternalTestView.wdInvokeEventHandler(InternalTestView.java:128)