批处理JDBC语句以提高处理速度

2024-04-23 12:58

本文主要是介绍批处理JDBC语句以提高处理速度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

批处理JDBC语句以提高处理速度

有的时候JDBC运行的不够理想,这就促使我们写一些与特定数据库相关的存储过程。作为一个替换方案,不妨试一下Statement的批处理特征,看看一次执行所有的SQL语句是否会带来速度的提升。
存储过程最简单的形式就是整个过程只包含一组SQL语句。将这些语句放到一起能容易管理也可以提高运行速度。Statement类具有包含一串SQL语句的能力,因此它允许所有的SQL语句在一个数据库会话中被执行,从而避免了向数据库进行一连串的执行调用。
使用批处理功能涉及到两个方法:
addBatch(String)方法
executeBatch方法

addBatch方法可以接受一段标准的SQL(如果你使用一个Statement)作为参数,也可以什么参数都不带(如果你使用一个PreparedStatement)。
executeBatch方法接着执行SQL语句,返回一个int型数组。这个数组包括每条语句影响到的行数。如果在一个批处理中使用是一个SELECT或者其它只返回结果的语句,那么将会产生一个SQLException异常。

下面是一个简单的java.sql.Statement的例子:

Statement stmt = conn.createStatement();
stmt.insert("DELETE FROM Users");
stmt.insert("INSERT INTO Users VALUES('rod', 37, 'circle')");
stmt.insert("INSERT INTO Users VALUES('jane', 33, 'triangle')");
stmt.insert("INSERT INTO Users VALUES('freddy', 29, 'square')");

int[] counts = stmt.executeBatch();

使用PreparedStatement会稍有不同。它只能处理一段SQL语句,但可以带很多参数。下面的是使用PreparedStatement重写的上面的例子:

      //注意我们并没有做任何删除动作

PreparedStatement stmt = conn.prepareStatement( _
"INSERT INTO Users VALUES(?,?,?)" );
User[ ] users = ...;
for(int i=0; i<users.length; i++)
{
stmt.setInt(1, users[i].getName());
stmt.setInt(2, users[i].getAge());
stmt.setInt(3, users[i].getShape());
stmt.addBatch( );
}
int[ ] counts = stmt.executeBatch();

这是处理那些不知道具体执行次数的SQL代码的一个好方法。没有批处理,如果要添加50个用户,其性能可能受到影响。如果谁写了一段添加10000个用户的脚本,其运行速度就难以忍受。增加批处理将有助于提升性能,在后一种情况里,甚至可以改善代码的可读性。

使用PreparedStatement减少开发时间

JDBC(Java Database Connectivityjava数据库连接)API中的主要的四个类之一的java.sql.Statement要求开发者付出大量的时间和精力。在使用Statement获取JDBC访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 PM。通过使用java.sql.PreparedStatement,这个问题可以自动解决。一个PreparedStatement是从 java.sql.Connection对象和所提供的SQL字符串得到的,SQL字符串中包含问号(?),这些问号标明变量的位置,然后提供变量的值,最后执行语句,例如:
Stringsql = "SELECT * FROM People p WHERE p.id = ? AND p.name = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1,id);
ps.setString(2,name);
ResultSet rs = ps.execute();

使用PreparedStatement的另一个优点是字符串不是动态创建的。下面是一个动态创建字符串的例子:
Stringsql = "SELECT * FROM People p WHERE p.i = "+id;

这允许JVMJavaVirtual MachineJava虚拟机)和驱动/数据库缓存语句和字符串并提高性能。
PreparedStatement也提供数据库无关性。当显示声明的SQL越少,那么潜在的SQL语句的数据库依赖性就越小。
由于PreparedStatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行SQL语句中没有变量的时候才使用通常的Statement
发出查询和处理结果
在任何你想向数据库运行一个SQL语句的时候,你都需要一个Statement PreparedStatement 实例。一旦你拥有了一个Statement PreparedStatement,你就可以发出一个查询。这样将返回一个ResultSet 实例,在其内部包含整个结果。 Example 31-1 演示了这个过程。
Example 31-1. JDBC 里处理一个简单的查询
这个例子将发出一个简单的查询然后用一个 Statement打印出每行的第一个字段。
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
while (rs.next()) {
       System.out.print("Column 1 returned ");
       System.out.println(rs.getString(1));
}
rs.close();
st.close();
这个例子将使用 PreparedStatement 发出和前面一样的查询,并且在查询中制作数值。
int foovalue = 500;
PreparedStatement st = db.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs = st.executeQuery();
while (rs.next()) {
      System.out.print("Column 1 returned ");
      System.out.println(rs.getString(1));
}
rs.close();
st.close();
31.3.1. 使用 Statement PreparedStatement 接口
在使用Statement PreparedStatement接口时必须考虑下面的问题:
你可以将一个Statement PreparedStatement实例使用任意次。你可以在打开一个联接后马上创建一个Statement 实例,并且在联接的生存期里使用之。你必须记住每个Statement PreparedStatement只能存在一个 ResultSet
如果你需要在处理一个ResultSet的时候执行一个查询,你只需要创建并且使用另外一个Statement
如果你使用了 threads (线程),并且有几个使用数据库,你对每个线程必须使用一个独立的Statement。如果考虑使用线程,请参考本文档稍后的 Section 31.8 章节,因为这些内容包含一些重要的信息。
在你用完 Statement 或者 PreparedStatement 之后,你应该关闭它。
31.3.2. 使用ResultSet(结果集)接口
使用ResultSet接口时必须考虑下面的问题:
在读取任何数值的时候,你必须调用next()。如果还有结果则返回真(true),但更重要的是,它为处理准备了数据行。
JDBC 规范里,你对一个字段应该只访问一次。遵循这个规则是最安全的,不过目前 PostgreSQL 驱动将允许你对一个字段访问任意次。
一旦你结束对一个 ResultSet 的处理,你必须对之调用 close()来关闭它。
一旦你使用那个创建ResultSet Statement做另一个查询请求,当前打开的 ResultSet 实例将自动关闭。
目前的 ResultSet 是只读的。你不能通过 ResultSet 来更新数据。如果你想更新数据,那么你就需要使用普通的方法来做∶通过发出一条 SQL 更新语句。这么做是和 JDBC 规范兼容的,它并不要求驱动提供可更新的结果集的支持。

这篇关于批处理JDBC语句以提高处理速度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928857

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁