|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。办理|数据良多人都对Java在批量数据的处置方面是不是是其符合的场合持有嫌疑的动机,由此延长,那末就会以为ORM大概也不是出格合适数据的批量处置。实在,我想假如我们使用妥当的话,完整能够打消ORM批量处置功能成绩这方面的挂念。上面以Hibernate为例来做为申明,假设我们真的不能不在Java中利用Hibernate来对数据举行批量处置的话。向数据库拔出100000条数据,用Hibernate大概像如许:
Sessionsession=sessionFactory.openSession();
Transactiontx=session.beginTransaction();
for(inti=0;i<100000;i++){
Customercustomer=newCustomer(.....);
session.save(customer);}
tx.commit();
session.close();
也许在运转到第50000条的时分,就会呈现内存溢出而失利。这是Hibernate把比来拔出的Customer都以session-levelcache在内存做缓存,我们不要健忘Hiberante并没无限制first-levelcache的缓存巨细:
#耐久对象实例被办理在事件停止时,此时Hibernate与数据库同步任何已产生变化的被办理的的对象。
#Session完成了异步write-behind,它同意Hibernate显式地写操纵的批处置。这里,我给出Hibernate怎样完成批量拔出的办法:
起首,我们设置一个公道的JDBC批处置巨细,hibernate.jdbc.batch_size20。然后在必定距离对Session举行flush()和clear()。
Sessionsession=sessionFactory.openSession();
Transactiontx=session.beginTransaction();
for(inti=0;i<100000;i++){
Customercustomer=newCustomer(.....);
session.save(customer);
if(i%20==0){
//flush拔出数据和开释内存:
session.flush();session.clear();}
}
tx.commit();
session.close();
那末,关于如何删除和更新数据呢?那好,在Hibernate2.1.6大概更后版本,scroll()这个办法将是最好的路子:
Sessionsession=sessionFactory.openSession();
Transactiontx=session.beginTransaction();
ScrollableResultscustomers=session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
intcount=0;
while(customers.next()){
Customercustomer=(Customer)customers.get(0);
customer.updateStuff(...);
if(++count%20==0){
//flush更新数据和开释内存:
session.flush();session.clear();}}
tx.commit();session.close();
这类做法其实不坚苦,也不算不文雅。请注重,假如Customer启用了second-levelcaching,我们仍旧会有一些内存办理的成绩。缘故原由就是关于用户的每次拔出和更新,Hibernate在事件处置停止后不能不公告second-levelcache。因而,我们在批处置情形下将要禁用用户利用缓存。
从一个编程语言的普及程度来将,一个好的IDE是至关中要的,而现在的java的IDE虽然已经很好了,但是和.net比起来还是稍微差一些的,这是个客观事实。java要想普及的更好。DE是必须加以改进的。 |
|