while循环查询和更新数据的速度问题

问题描述

每次循环会select出几千--几万不等的数据,然后对其处理后再更新回去。经过计算,每分钟才处理3000条数据左右,太慢了,请大家帮着查看。where条件很简单,应该不存在索引问题。是不是和数据库链接的建立有关系?请大家多多指教。代码大概如下: Statement stmt_Select = con.createStatement(); Statement stmt_Update = con.createStatement(); while (***) { String sql = "select a, b, c from tablename where ......."; stmt_Select.close(); stmt_Select=con.createStatement(); stmt_Update.close(); stmt_Update=con.createStatement(); rs = stmt_Select.executeQuery(sql); int i = 0; while (rs.next()){ // 这里会对select出来的值进行两次md5加密等 i = i + stmt_Update.executeUpdate("update tablename set a=......); } rs.close(); }

解决方案

建议批量的去执行更新、插入的操作
解决方案二:
建议你使用Updatable statement,给你一段我以前写过的代码吧,这段代码用来处理14万条记录,具体时间记不太清了,不过效率还是挺高的:String sql = "select ccrq,dt_factory_date from ajdq";Connection con = DbUtil._CONNECTION;//获得数据库连接Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs = st.executeQuery(sql);int i=0;while(rs.next()){String date = rs.getString(1);Date d = DateUtil.parse(date);if(d!=null){rs.updateTimestamp(2, new Timestamp(d.getTime()));rs.updateRow();i++;System.out.print(".");if(i%100==0){System.out.println(i);con.commit();}}}rs.close();st.close();System.out.println();System.out.println(i);con.commit();con.close();
解决方案三:
建议写个存储过程处理,你的业务也不算复杂。与数据库交互必然会耗费很多时间的。
解决方案四:
PreparedStatement引用 PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592)
解决方案五:
stmt_Select.close(); stmt_Select=con.createStatement(); stmt_Update.close(); stmt_Update=con.createStatement(); 不要在循环里面频繁的close, 全部放在rs.close()之前参考如下stmt_Select.close();stmt_Update.close();rs.close();

时间: 2024-11-26 20:40:13

while循环查询和更新数据的速度问题的相关文章

Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 2.查询数据 我们自定义一个列表控制器PKOBookDetailTableViewController,并应用到storyboard的明细显示view

通过WCF引用ListData.svc查询,更新数据

SharePoint 2010自带了一个开箱即用的WCF服务--ListData.本博文中,我们将一步一步的学习如何使用ListData.svc. 准备工作 创建一个网站,包含两个列表,分别是 客户和城市.为列表填写一些列表项.客户列表应包含一个名为城市的栏,作为查阅项关联到城市列表. 城市列表: 客户列表:

MySQL 随机查询数据与随机更新数据实现代码_Mysql

MySQL随机查询数据 以前在群里讨论过这个问题,比较的有意思.MySQLl的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了. 复制代码 代码如下: SELECT * FROM table_name ORDER BY rand() LIMIT 5; MySQL的rand()函数在手册里是这么说的: RAND() RAND(N) 返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值. 关于MySQL

package-ORACLE获取结果集的同时更新数据,该如何实现

问题描述 ORACLE获取结果集的同时更新数据,该如何实现 公司现有的一个项目,数据都存在ORACLE里面的,其中一个表是存储流水信息的,由一个程序负责写入数据另一个程序进行读取并更新状态,现在需要提高读取速度,拟将读取改成多线程的读取,该如何处理? 为确保效率和避免重复读取,我考虑了以下方案: 1.通过package实现返回结果集,并把这些结果集的记录直接记为已读取:这样操作使整个读取只需更新一次状态,但实现时发现,采用游标读取了这些记录后,再根据游标对这些数据的状态进行更新会导致游标移动到结

vb.net2003中,利用datagrid更新数据

datagrid|数据 运行环境说明:Windows 2000 Advanced Server +VB.NET2003+MS SQL SERVER 2000 第1部份 建立数据库student,建立表stuinf(有两种方式)  1.1 方式一:用查询分析器建库,语句如下:  use master  go if exists (select * from dbo.sysdatabases where name = 'student') drop database student  gocreat

实例讲解Java批量插入、更新数据_java

Java的批量添加数据,多个字段同时添加多条数据,我不知道你遇到过没有.今天我们就以一个具体的实例来说一下Java的批量添加数据,面向的是Oracle数据库. 前台页面: <span style="font-size:14px;"><body class="main_body" scroll="no"> <div class="employee_gun_dong"> <form nam

mysql- Mybatis select 没有获取更新数据 (缓存 ?)

问题描述 Mybatis select 没有获取更新数据 (缓存 ?) 写了一个简单的mybatis demo,没有集成其他事务管理,对接mysql数据库. 在表file_resources的mapper里面定义了一个这样的嵌套sql , 里面用到了 postinfo . poststatus两个表 </select> <select id=""selectPendingPostItemCount"" resultType=""

服务器-iOS 数据 设置模式 优化 数据返回速度

问题描述 iOS 数据 设置模式 优化 数据返回速度 现在APP的问题 ,后台.很小压力很大,逻辑判断复杂,返回数据速度太慢. 现在的流程:我要所搜附近的小时工,手机定位把自己的坐标发给付服务器,服务器跳去所有的员工,首先判断服务类型是否为小时工 然后判断是否空闲 剩下若干个空闲的小时工,然后根据系统工具和小时工的坐标计算剩下每个小时工到客户的距离,根据距离排序,取里的最近的几个人返回.经过这一系列操作所耗费的时间太长,现在想优化,减少时间. 解决方案1. 把客户端和员工端增加固定地址的设置,客

数据联查+数据更新-两个表比对,更新数据

问题描述 两个表比对,更新数据 mysql 里面 我有2个表,两个表分别是A和B A表里面有id 和sfzbh B表里面有id 和aid 和 sfzbh 现在A表里面有100W条数据 B表里面有20W条数据 我想将B表的数据和A表进行比对,如果发现B表数据在A表里面,那么B表的aid的值就等于A表的id 怎么循环查询更新 求教了,在线等,谢谢,2015-05-17 11:48分 解决方案 一个查询就可以啦 update a set a.id = b.aid from A as a inner j