1 hibernate 一級緩存
Session?
? evict(Object o) 從緩存中清除指定的持久化對象
? clear()???????? 清除緩存中所有對象
2 批量更新于批量刪除
? 1) 批量更新
?? Iterator customers=session.find("from Customer c where c.age>0");
?? while(customers.hasNext()){
???? Customer customer=(Customer)customers.next();
???? customer.setAge(customer.getAge()+1);
?? }
?? tx.commit();
?? session.close();
? 缺點:內(nèi)存中加載了大量數(shù)據(jù)
??????? 執(zhí)行了多次update 語句
?
?? 改進
?? Iterator customers=session.find("from Customer c where c.age>0");
?? while(customers.hasNext()){
???? Customer customer=(Customer)customers.next();
???? customer.setAge(customer.getAge()+1);
???? session.flush();
???? session.evict(customer);
?? }
?? tx.commit();
?? session.close();
?? 遺留問題
?? 執(zhí)行了多次update 語句
??
?? 采用jdbc api 進行調(diào)用
?? Connection con=session.connection();
?? PrepareStatement stmt=con.prepareStatement("update customers set age=age+1 where age>0");
?? stmt.executeUpdate();
?? tx.commit();
?? 另外,也可以調(diào)用底層的存儲過程進行批量更新
?? create or replace procedure batchUpdateCustomer(p_age,in number) as
?? begin
????? update customer set age=age+1 where age>p_age;
?? end;
??
?? tx=session.beginTransaction();
?? Connection con=session.connection();
?? CallableStatement cstmt=con.prepareCall(batchUpdateCustomer);
?? cstmt.setInt(1,0);
?? cstmt.eqecuteUpdate();
?? tx.commit();
?? 2) 批量數(shù)據(jù)的刪除
??? session.delete("from? Customer c where c.age>0");
??? 實際調(diào)用的過程
??? session * from Customer where age>0;
??? 在把所有數(shù)據(jù)加載到內(nèi)存之后執(zhí)行多條delete 語句
??? delete from customer where id=i;
???? .......................
?? 改進辦法采用jdbc api 進行批量數(shù)據(jù)的刪除
?????
?? tx=session.beginTransaction();
?? Connection con=session.connection();
?? con.execute("delete from customers where age>0");
?? tx.commit();