JDBC批量操作:
/** * 批量执行sql语句,by statement */ public static Boolean executeStatementBatchSQL(Connection conn, List<String> sqlList) { try { // 创建执行SQL的对象 Statement stmt = conn.createStatement(); for (String sql : sqlList) { stmt.addBatch(sql); } int[] result = stmt.executeBatch(); Boolean tag=true; for(int i=0;i<result.length;i++){ if(i<0){ tag=false; } } return tag; } catch (SQLException e) { return false; } } /** * 批量执行sql语句,by preparedStatement */ public static Boolean executePreparedStatementBatchSQL(Connection conn, String sql, int[] param1, String[] param2) { try { // sql="UPDATE EMPLOYEES SET SALARY = ? WHERE ID =?"; PreparedStatement pstmt = conn.prepareStatement(sql); for(int i =0;i<10;i++){ pstmt.setInt(1, param1[i]); pstmt.setString(2, param2[i]); pstmt.addBatch(); } int[] result = pstmt.executeBatch(); Boolean tag=true; for(int i=0;i<result.length;i++){ if(i<0){ tag=false; } } return tag; } catch (SQLException e) { return false; } }
Hibernate批量操作:
链接:
http://www.iteye.com/problems/20904
http://blog.csdn.net/xiazdong/article/details/7709068
http://www.iteye.com/topic/17801
http://bbs.csdn.net/topics/320193024
--Hibernate定时清理缓存,flush(),clear()
http://blog.csdn.net/xiazdong/article/details/7709068
http://www.iteye.com/problems/34922
for(...){ ... session.save(info); if(i%50==0){ //以每50个数据作为一个处理单元 session.flush(); //保持与数据库数据的同步 session.clear(); //清除内部缓存的全部数据,及时释放出占用的内存 } ... }
--采用Jdbc executeBatch()
--采用 sql: inser into t() values(),(),()...();
--设计存储过程
--根据这个需求设计中间索引
直接通过Hibernate API进行批量更新和批量删除都不值得推荐。
而直接通过JDBC API执行相关的SQL语句或调用相关的存储过程,是批量更新和批量删除的最佳方式,这两种方式都有以下优点:
(1) 无需把数据库中的大批量数据先加载到内存中,然后逐个更新或修改它们,因此不会消耗大量内存。
(2) 能在一条SQL语句中更新或删除大批量的数据。
---方案:
1、 更换数据库
鉴于MSSqlServer的数据吞吐能力比较低下,因此可采用性能优良的Oracle系列数据库
优点:可以在一定程度上减轻压力。
缺点:价格较高 单CPU 20万左右,且不能彻底解决问题。
2、 集群
可有效的分散数据,减轻单个数据库压力,鉴于MSSqlServer不支持透明集群,可采用数据库分散部署的办法即采用多台服务器部署多个数据库每台数据库包含不同的表。
优点:可靠性伸缩性能好。
缺点:购置服务器费用高昂,需采用跨数据库事务处理性能较差。对系统开发要求较高。
3、 分表
采用将大表分拆成多个小表,采用按时间、类型等方式分拆,使得单次操作数据量控制在可控的范围内。
优点:节省成本。
缺点:系统复杂,对系统开发要求很高。
---优化Hibernate配置参数:
链接:http://blog.csdn.net/a9529lty/article/details/6660118
MySQL不支持hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size
hibernate.jdbc.fetch_size 50 //读
hibernate.jdbc.batch_size 30 //写
Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数
例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。
Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小
---存储过程:
http://bbs.csdn.net/topics/40306074
http://blog.csdn.net/jackmacro/article/details/5688687
http://www.cnblogs.com/ego/archive/2012/12/06/2804592.html
http://database.51cto.com/art/201108/281777.htm
---数据库拆表:
http://www.cnblogs.com/VipBin/archive/2011/07/12/2104690.html
http://wentao365.iteye.com/blog/1740691
通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。
水平切分数据库,可 以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失。
通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性;
通过集群方案, 解决了数据库宕机带来的单点数据库不能访问的问题;
通过读写分离策略更是最大限度了提高了应用中读取(Read)数据的速度和并发量。
分布式数据访问
http://blog.csdn.net/wenwen_2008/article/details/8267377