|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,
批量更新是指在一个事件中更新多量量数据,批量删除是指在一个事件中删除多量量数据。以下程序间接经由过程HibernateAPI批量更新CUSTOMERS表中岁数年夜于零的一切纪录的AGE字段:
tx=session.beginTransaction();
Iteratorcustomers=session.find("fromCustomercwherec.age>0").iterator();
while(customers.hasNext()){
Customercustomer=(Customer)customers.next();
customer.setAge(customer.getAge()+1);
}
tx.commit();
session.close();
假如CUSTOMERS表中有1万条岁数年夜于零的纪录,那末Session的find()办法会一会儿加载1万个Customer对象到内存。当实行tx.commit()办法时,会清算缓存,Hibernate实行1万条更新CUSTOMERS表的update语句:
updateCUSTOMERSsetAGE=?….whereID=i;
updateCUSTOMERSsetAGE=?….whereID=j;
……
updateCUSTOMERSsetAGE=?….whereID=k;
以上批量更新体例有两个弱点:
(1)占用大批内存,必需把1万个Customer对象先加载到内存,然后逐一更新它们。
(2)实行的update语句的数量太多,每一个update语句只能更新一个Customer对象,必需经由过程1万条update语句才干更新一万个Customer对象,频仍的会见数据库,会年夜年夜下降使用的功能。
为了敏捷开释1万个Customer对象占用的内存,能够在更新每一个Customer对象后,就挪用Session的evict()办法当即开释它的内存:
tx=session.beginTransaction();
Iteratorcustomers=session.find("fromCustomercwherec.age>0").iterator();
while(customers.hasNext()){
Customercustomer=(Customer)customers.next();
customer.setAge(customer.getAge()+1);
session.flush();
session.evict(customer);
}
tx.commit();
session.close();
在以上程序中,修正了一个Customer对象的age属性后,就当即挪用Session的flush()办法和evict()办法,flush()办法使Hibernate立即依据这个Customer对象的形态变更同步更新数据库,从而当即实行相干的update语句;evict()办法用于把这个Customer对象从缓存中扫除进来,从而实时开释它占用的内存。
但evict()办法只能略微进步批量操纵的功能,由于不论有无利用evict()办法,Hibernate都必需实行1万条update语句,才干更新1万个Customer对象,这是影响批量操纵功能的主要要素。假设Hibernate能间接实行以下SQL语句:
updateCUSTOMERSsetAGE=AGE+1whereAGE>0;
那末以上一条update语句就可以更新CUSTOMERS表中的1万笔记录。可是Hibernate并没有间接供应实行这类update语句的接口。使用程序必需绕过HibernateAPI,间接经由过程JDBCAPI来实行该SQL语句:
tx=session.beginTransaction();
Connectioncon=session.connection();
PreparedStatementstmt=con.prepareStatement("updateCUSTOMERSsetAGE=AGE+1"
+"whereAGE>0");
stmt.executeUpdate();
tx.commit();
以上程序演示了绕过HibernateAPI,间接经由过程JDBCAPI会见数据库的历程。使用程序经由过程Session的connection()办法取得该Session利用的数据库毗连,然后经由过程它创立PreparedStatement对象并实行SQL语句。值得注重的是,使用程序仍旧经由过程Hibernate的Transaction接口来声明事件界限。
假如底层数据库(如Oracle)撑持存储历程,也能够经由过程存储历程来实行批量更新。存储历程间接在数据库中运转,速率加倍快。在Oracle数据库中能够界说一个名为batchUpdateCustomer()的存储历程,代码以下:
createorreplaceprocedurebatchUpdateCustomer(p_ageinnumber)as
begin
updateCUSTOMERSsetAGE=AGE+1whereAGE>p_age;
end;
<p>
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解 |
|