0 0

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

每次循环会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(); 
        }    
2012年12月27日 18:56

5个答案 按时间排序 按投票排序

0 0

采纳的答案

建议批量的去执行更新、插入的操作

2012年12月27日 20:38
0 0

建议你使用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();

2012年12月28日 11:13
0 0

建议写个存储过程处理,你的业务也不算复杂。与数据库交互必然会耗费很多时间的。

2012年12月28日 09:24
0 0

PreparedStatement

引用
   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)

2012年12月28日 08:34
0 0

               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();

2012年12月27日 19:15

相关推荐

    UDP编程实战while循环版

    3. **while循环**:在实战中,我们可能会用while循环来持续接收或发送数据,实现一个持续监听并处理数据的服务器或客户端。例如,服务器端可能不断调用`recvfrom()`等待接收数据,然后根据收到的数据进行响应;...

    python 学习笔记-while 循环

    while循环可以用来处理列表和字典等数据结构。例如,可以在列表中移动元素,或者删除包含特定值的所有列表元素。通过用户输入,还可以向字典中填充数据。 3. 与用户交互: 利用while循环可以实现与用户的交互,...

    R语言循环For while

    (2)apply函数族和泛型函数map能够更加高效简洁地实现一般的for循环、while循环,但这不代表for循环、while循环就没用了,它们可以在更高的层次使用(相对于在逐元素级别使用) 1. 基本for循环 例如,有如下的...

    易语言源码循环语句的用法之速度比较.rar

    比如,对于大数量级的循环,for...to循环可能比while循环更快,因为它在编译时就能确定循环次数,而while循环则需要在运行时动态判断。另一方面,foreach循环通常会利用内置的迭代器,其速度依赖于数据结构的实现。 ...

    循环语句的用法之速度比较.rar

    在很多编程语言中,for循环的速度与while循环相当,但其简洁性和易读性使得它在许多场合更受欢迎。 2. **while循环**:while循环基于一个条件进行迭代,只要条件为真,就会继续执行循环体。这种循环适合处理未知...

    使用While循环进行连续采集图形并且进行边缘提取的处理.rar

    总的来说,"使用While循环进行连续采集图形并且进行边缘提取的处理"是一个基础但实用的LabVIEW机器视觉教程,适合初学者了解和掌握图像处理的基本流程。通过实践这个项目,不仅可以学习到LabVIEW的基本操作,还能...

    易语言源码循环语句的用法之速度比较.7z

    其特点是在至少会执行一次的情况下使用,速度与While循环相当。 5. **ForEach...Next循环**: ForEach循环用于遍历集合或数组中的每个元素,无需知道元素的总数。它的形式为`ForEach 变量 In 集合 代码块 Next`。...

    oracle循环游标

    在Oracle数据库中,循环游标是一种非常重要的编程技术,它允许开发者通过循环结构来处理查询结果集中的每一行数据。这种技术在处理大量数据时尤为有用,因为它可以逐行访问数据,而无需一次性将所有数据加载到内存中...

    循环语句的用法之速度比较

    这种循环的效率主要取决于条件判断的速度和循环体内代码的复杂性。 2. **“直到”语句**:“直到”循环与“循环”相反,它先执行循环体,然后检查条件,如果条件不满足,继续执行下一次循环。在某些情况下,这种...

    Matlab数组循环赋值的三种方法深入解析.pdf

    本文将详细讨论三种常见的数组循环赋值方法:基本的for循环、while循环以及向量化赋值。 首先,我们来看基本的for循环。这是最直观且最易理解的方式,适用于任何需要迭代赋值的情况。for循环的语法结构是`for index...

    oracle批量删除数据

    - 使用`WHILE 1 = 1 LOOP`进行无限循环,直到所有满足条件的数据都被删除。 - 通过`EXECUTE IMMEDIATE`动态执行SQL删除语句,每次只删除指定数量的记录(`p_Count`)。 - 利用`ROWNUM`限制每次循环中删除的数据量。...

    C语言23:用do-while语句控制P0口8位LED流水点亮.rar

    在本教程中,我们将深入探讨如何使用C语言的...通过调整延时时间和位移操作,我们可以改变LED的闪烁速度和流动方向,从而创造出各种视觉效果。这个项目对于学习C语言的流程控制以及嵌入式系统的IO操作是非常有帮助的。

    C# 串口通信(彻底解决C#串口通信中的数据丢失问题)

    - 在`StartMonitor`方法中循环读取串口数据,如果读取到的数据长度大于0,则停止定时器。 - 使用`Invoke`方法更新UI显示最新的数据。 #### 关键函数说明 - **`theout`**: 定时器超时事件处理函数。 - **`Read...

    对C语言组织循环的方法探讨.pdf

    手工计算依赖于人的经验来选择合适的方法以减少工作量,提高计算速度和精度;而计算机计算则擅长简单重复的运算,这正好符合计算机高速处理大量数据的优势。在循环结构设计中,程序员应利用计算机的这一特点,编写...

    单片机数字循环.rar

    - **Do...While循环**:与While循环类似,但不同之处在于其先执行一次循环体,然后检查条件,如果条件满足则继续执行。 2. **循环控制** - **循环条件**:循环何时停止由循环条件决定,通常在循环头进行判断。 -...

    Rust语言简介、for循环的demo代码

    Rust 是一种系统编程语言,专注于安全、速度和并发。它由 Mozilla 基金会的 Graydon Hoare、Mozilla Research 的 Brian Anderson 和 Dave Crane 发明,旨在解决 C++ 中常见的安全问题,同时保持高性能。Rust 被设计...

    查询速度调研 1

    在`test()`方法中,代码使用while循环逐步增大范围,每次增加1000,直到达到1000000。这使得我们能观察不同规模数据下的查询性能差异。在每个范围,代码都会记录20次查找操作的时间,然后计算平均值,以避免偶然性...

    利用循环队列移动元素

    - **缓冲区管理**:在网络传输、音频播放等系统中,循环队列常被用来作为数据缓冲,有效地平衡数据的生产和消费速度。 - **多线程编程**:在并发环境中,循环队列可作为线程间通信的工具,例如生产者-消费者问题。...

    三程序结构PPT学习教案.pptx

    移位寄存器是For循环和While循环中用于存储和传递数据的重要组件。它可以保存上一次循环的值,以便在下一次循环中使用。移位寄存器支持数字型、布尔型、字符串等多种数据类型,并且可以设置初始值。通过添加附加端口...

    matlab_matlab循环_citizenumj_

    MATLAB支持多种类型的循环,包括`for`循环、`while`循环和`parfor`循环,它们各自在不同的场景下有着不同的应用。 1. `for`循环: `for`循环通常用于遍历序列或集合中的元素。它由一个初始化语句、一个测试条件和...

Global site tag (gtag.js) - Google Analytics