首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Hibernate 利用无状态session 解决大批量上传、修改数据缓慢的有关问题

2012-08-19 
Hibernate 利用无状态session 解决大批量上传、修改数据缓慢的问题在最近的SSH项目里面需要做大量数据上传(

Hibernate 利用无状态session 解决大批量上传、修改数据缓慢的问题
在最近的SSH项目里面需要做大量数据上传(上万条数据的insert),而问题的现象就是刚开始速度很快,每秒几十条,随时时间越往后上传速度越慢,最后只有每秒一条。Web服务器的CPU占有率和内存都进行过调查,没有问题,代码也进行了无数次的优化,问题还是没有解决。最后才发现原来是Hibernate的Session的问题。最后使用StatelessSession,问题解决。



StatelessSession (无状态session)接口



利用无状态session,可以解决:大批量上传、修改数据缓慢的问题。



注:StatelessSession在Hibernate3.3.2中有,我知道3.0中没有,其他的不知道



作为选择,Hibernate提供了基于命令的API,可以用detached object的形式把数据以流的方法加入到数据库,或从数据库输出。StatelessSession没有持久化上下文,也不提供多少高层的生命周期语义。特别是,无状态session不实现第一级cache,也不和第二级缓存,或者查询缓存交互。它不实现事务化写,也不实现脏数据检查。用stateless session进行的操作甚至不级联到关联实例。stateless session忽略集合类(Collections)。通过stateless session进行的操作不触发Hibernate的事件模型和拦截器。无状态session对数据的混淆现象免疫,因为它没有第一级缓存。无状态session是低层的抽象,和低层JDBC相当接近。


StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
 
ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    session.update(customer);
}
 
tx.commit();
session.close();


注意在上面的例子中,查询返回的Customer实例立即被脱管(detach)。它们与任何持久化上下文都没有关系。

StatelessSession 接口定义的insert(), update() 和 delete()操作是直接的数据库行级别操作,其结果是立刻执行一条INSERT, UPDATE 或 DELETE 语句。因此,它们的语义和Session 接口定义的save(), saveOrUpdate() 和delete() 操作有很大的不同。

热点排行