- 浏览: 7154909 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
部分内容转自 :http://gaolixu.iteye.com/blog/519086
部分内容转自 :http://superjavason.iteye.com/blog/255423
--------------------------------------------------------------------------------------------
hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25
这面这两项属性很重要
配置方法如下:
<session-factory>
...
<property name="hibernate.jdbc.batch_size">50</property>
...
</session.factory>
--------------------------------------------------
Fetch Size (抓取大小):
是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。
一般我们查询时会返回一个ResultSet对象,他其实是一个数据库的游标,要时刻保持与数据库的连接,不可断开。
例如一次查询结果是1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条结果全返出来的,而只会返出Fetch Size数量的记录,当不够用时,再去数据库取Fetch Size条数据,当然这一过程你是完全感觉不出来的。
Fetch Size设的越大,读数据库的次数越少,速度越快,越耗内存;
Fetch Size设的越小,读数据库的次数越多,速度越慢,前期会省内存(后期1万条都读出来了还是要用内存的)。
Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据我的测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。
因此我建议使用Oracle的一定要将Fetch Size设到50。
不过并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。
MySQL就像我上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了 :(
---------------------------------------------------------------------------
Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。
Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!
这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。
-----------------------------------------------------------------------------
hibernate.max_fetch_depth 设置外连接抓取树的最大深度取值. 建议设置为0到3之间
就是每次你在查询时,会级联查询的深度,譬如你对关联vo设置了eager的话,如果fetch_depth值太小的话,会发多很多条sql
-----------------------------------------------------------------------------
1 伪批量删除
public void delete(final List<Integer> ids) { final Session session = hibernateUtil.getCS(); final Query q = session.createQuery("delete from Img where userId=:userId and id in(:ids)"); final User user = (User) ActionContext.getContext().getSession().get("s"); q.setInteger("userId", user.getId()); q.setParameterList("ids", ids); q.executeUpdate(); }
2 批量插入
大家说下面的代码,50次flush一下, 如果同时也设置了<property name="hibernate.jdbc.batch_size">40(或其它值)</property>会怎么样呢?
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Customer customer = new Customer(.....); //如果你的 hibernate.cache.use_second_level_cache 是 true, 请在会话级别上关闭他 //向(任何一级)缓存中加载大量数据通常也意味着它们很快会被清除出去,这会增加GC开销。 session.setCacheMode(CacheMode.IGNORE); session.save(customer); if ( i % 50 == 0 ) { //将本批插入的对象立即写入数据库并释放内存 session.flush(); session.clear(); } } tx.commit(); session.close();
--------------------------------------------------------------------------------------------------------------
JDBC批量操作
Statement加批量的方法
conn.setAutoCommit(false); Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); for(int x = 0; x < size; x++){ stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')"); } stmt.executeBatch(); conn.commit();
使用PreparedStatement加批量的方法
try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(o_url, userName, password); conn.setAutoCommit(false); String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)"; PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); for(int x = 0; x < size; x++){ prest.setString(1, "192.168.1.1"); prest.setString(2, "localhost"); prest.setString(3, "20081009"); prest.setInt(4, 8); prest.setString(5, "11111111"); prest.addBatch(); } prest.executeBatch(); conn.commit(); conn.close(); } catch (SQLException ex) { Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex); }
注意上面JDBC驱动使用的是mysql的, 好像不支持批量更新,所以大家一定要使用oracle的JDBC驱动试验啊。
评论
来存放,通过url传递 比如.jsp?ID=array
我后台获取String ID = String ID = request.getParameter("ID");
DAO
//批量删除 @SuppressWarnings("unchecked") public void deleteUser(final String ids) throws Exception { final String queryString = "delete from BaUser where recId in (:ids) "; hibernateTemplate.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException{ Query query = session.createQuery(queryString); query.setString("ids", ids); return query.executeUpdate(); } }); }
Controller
protected void delete(Writer writer , HttpServletRequest request) throws Exception { String ID = request.getParameter("ID"); System.out.println(ID); userDao.deleteUser(ID); } 我多选了几个,但是它只删除第一个,其它的没有删除 但是查看信息的时候,却是正确是sql语句啊
26,28,29 //输出获取到的ID
[17:19:08] [DEBUG] -- Opening Hibernate Session
[17:19:08] [DEBUG] -- opened session at timestamp: 12790127482
[17:19:08] [TRACE] -- located HQL query plan in cache (delete from BaUser where recId in (:ids) )
[17:19:08] [TRACE] -- located HQL query plan in cache (delete from BaUser where recId in (:ids) )
[17:19:08] [TRACE] -- executeUpdate: delete from BaUser where recId in (:ids)
[17:19:08] [TRACE] -- named parameters: {ids=26,28,29}
[17:19:08] [DEBUG] -- about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
[17:19:08] [DEBUG] -- opening JDBC connection
[17:19:08] [DEBUG] -- delete from T_BA_USERS where REC_ID in (?)
Hibernate: delete from T_BA_USERS where REC_ID in (?)
[17:19:08] [TRACE] -- preparing statement
[17:19:08] [TRACE] -- binding '26,28,29' to parameter: 1
[17:19:08] [DEBUG] -- about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
然后在使用session.setParameter();
但是楼主提供的这种方式更加的简洁。
public void delete(final String[] ids)
q.setInteger("userId", Arrays.asList(ids));
这样,单个删除或批量都可以了
当然数组的定义要和你的 img 实体字段类型相同,否则就会报错
发表评论
-
Hibernate二级缓存 ---- 最佳实践
2010-11-08 10:17 39219作者:赵磊 博客:ht ... -
Hibernate--泛型DAO
2010-06-27 19:49 4989泛型DAO(翻译) http://www.iteye.com ... -
Hibernate--空位
2010-06-27 15:41 1721原文章已合并整理到: http://elf8848.itey ... -
Hibernate二级缓存 ---- 入门示例
2010-06-27 15:34 4107一. 我们使用oscache来演示 , 引入oscache的j ... -
Hibernate 操作Blob Clob
2010-06-14 16:50 5174Photo.java import java.sql.Bl ... -
Hibernate ---- 控制日志
2010-06-06 11:46 2996Hibernate版本 3.3或3.4 Hibernate ... -
Hibernate悲观锁定与乐观锁定
2010-05-17 15:08 2165悲观锁定 由数据库方面实现. 可见:Hibernate悲观锁 ... -
Hibernate懒加载深入分析
2010-05-14 11:22 8227[size=small] ------------------ ... -
Hibernate分页查询与泛型
2009-03-26 19:03 7310JE有两篇文章,关于分页查询 与泛型 的,写的很好.这里收藏一 ... -
20 Hibernate 1+N问题的原理与解决
2009-03-04 09:44 13021什么时候会遇到1+N的问题? 前提:Hibernate默认表 ... -
19 Criteria查询,DetachedCriteria离线查询 --做综合查询
2009-03-04 09:35 3677通过Session得到Criteria类的对象 /** ... -
空位空位
2009-03-03 10:22 2238空位空位空位空位 -
17 继承(四)每一个具体的类 映射到一张表
2009-03-02 13:54 2248类(Person) , 男人(Men)继 ... -
16 继承(三)(把前面14,15讲的情况结合起来)
2009-03-02 13:30 2046人类(Person) , 男人(Men)继承"人& ... -
15 继承(二)(每个子类扩展的属性单独保存在一张表中)
2009-03-02 13:07 2023人类(Person) , 男人(Men)继承" ... -
14 继承(一)(整个继承树映射到一张表)
2009-03-02 11:00 2170人类(Person) , 男人(Men)继承" ... -
13 级联和关系维护(Cascade 和Inverse)
2009-03-01 17:58 2989Cascade用来说明当对主对象进行某操作时, 是否对其关联的 ... -
12 映射-- 集合类的映射(Set,List,Map,Array)
2009-03-01 16:18 2573部门类Department , 他有 empa1, emp ... -
11 映射-- 组件映射(人类与姓名类)
2009-03-01 15:26 2313User类: 注意他的name属性 package ... -
10 映射-- 多对多(老师与学生)
2009-03-01 15:01 2530学生类: package dao.po; impo ...
相关推荐
在我们的Java项目中,批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据。批量删除虽然在Hibernate里也可以实现,但...其实Hibernate提供的JDBC接口,可以方便的进行批量的更新和删除。
Hibernate hibernate.jdbc.batch_size 测试带有 MySQL JDBC 驱动程序的 Hibernate 批量插入示例。 에 관한 설명
主要介绍了Hibernate+JDBC实现批量插入、更新及删除的方法,结合实例形式较为详细的分析了Hibernate与JDBC针对数据库的批量操作相关实现技巧,需要的朋友可以参考下
Hibernate 批量删除和更新 4、如何有选择地取表的字段信息? 5、如果表无主键,是否在Hibernate中一定不能实现了? 7、left join与right join具体应如何在Hibernate中配置? 8、统计如何实现?如何配置...
批量操作在xml文件中配置使用hibernate自带的 JDBC实现:批量跟新(1)hibernate自带(2)JDBC实现批量删除hibernate实现 JD
hibernate效率注意的几个问题,批量删除和批量更新建议用JDBC,这是一个原则,当然有的时候可能必须用Hibernate来批量更新和批量删除,那么这个时候我想说的就是,Hibernate批量更新和删除效率并非传说中的那么差,...
有很多人认为Hibernate天生效率比较低,确实,在普遍情况下,需要将执行转换为SQL语句的 Hibernate 的效率低于直接JDBC存取,然而,在经过比较好的性能优化之后,Hibernate的性能还是让人相当...3.批量数据操作 4.杂项
背景开发人员普遍担心,使用工具(ORM)将严重影响其应用程序的性能,尤其是在数据库包含大量记录或需要批量获取数据的情况下。 一些开发人员创建了工作基准,表明使用ORM与使用原始JDBC相比,可导致性能下降10或100...
3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA ...
Hibernate配置各种数据源 <hibernate-configuration> <!– 各属性的配置–> <!—为true表示将Hibernate发送给数据库的sql显示出来 –> ...– 设定对数据库进行批量删除 –> ”jdbc.batch_size”>30</property>
9.4.4 直接通过JDBC API来进行批量操作 9.5 使用元数据 9.6 通过Hibernate调用存储过程 9.7 小结 9.8 思考题 第10章 映射组成关系 10.1 建立精粒度对象模型 10.2 建立粗粒度关系数据模型 10.3 映射...
最近在深入学习hibernate,在进行批量操作时,发现hibernate批量操作性能非常低.于是就想找一个性能较高的方法,在对jdbc、jdbcTemplate、hibernate进行测试后,发现jdbc的执行效率是最高的,jdbcTemplate也很相近,...
主要介绍了详解jdbc实现对CLOB和BLOB数据类型的操作的相关资料,这里实现写入操作与读写操作,需要的朋友可以参考下
-- 由于每个应用的数据库连接配置,可能不一样,有些是Hibernate, OJB, Spring或者其它。。。。请按照相应的配置文件修改即可。 -- dbcp还要再试试,才知道是否支持,理论是支持的。 4. 编辑spy.properties...
3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA ...
3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA ...
3、QueryBuilder:单表查询基本上都可以实现零Sql(除非查询条件特别复杂的),更新、删除等操作也可以通过QueryBuilder进行批量处理,不局限于根据主键来处理。 4、分表操作的支持:对于分表操作和常规的使用...
3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计...
12.2 大批量和批量操作 12.2.1 使用HQL和JPA QL的大批量语句 12.2.2 利用批量处理 12.2.3 使用无状态的会话 12.3 数据过滤和拦截 12.3.1 动态数据过滤 12.3.2 拦截Hibernate事件 ...