在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)