`

处理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.getName());
stmt.setInt(2, users.getAge());
stmt.setInt(3, users.getShape());
stmt.addBatch( );
}
int[ ] counts = stmt.executeBatch();

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



使用PreparedStatement减少开发时间

JDBC(Java Database Connectivity,java数据库连接)的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;


这允许JVM(JavaVirtual Machine,Java虚拟机)和驱动/数据库缓存语句和字符串并提高性能。

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 规范兼容的,它并不要求驱动提供可更新的结果集的支持。





• SQLServer和嵌入式SQL  07.10.03  from whli88 
• 一劳永逸的数据库编码解决方案  07.08.28  from fondofbeyond 
• sql server的数据库的jdbc驱动程序与数据库的连接  07.07.17  from N_once 
• SQL语句学习_雨情相乐  07.06.28  from oice 
• 使用SQL TRACE 实用工具和TKPROF  07.05.11  from dazheng 

分享到:
评论

相关推荐

    JDBC的批量处理语句

    这种方法可以大大提高更新处理速度,减少数据库访问次数,提高应用程序的性能。 在 JDBC 中,批量处理语句包括两个方法:addBatch(String) 和 executeBatch()。addBatch(String) 方法用于添加需要批量处理的 SQL ...

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

    JDBC(Java Database Connectivity)作为Java与数据库交互的标准接口,提供了一种批量处理SQL语句的功能,以提高处理速度,减少网络通信开销,从而优化整体性能。当JDBC运行速度慢时,开发者可能会转向使用数据库的...

    JDBC的批量处理数据

    通过合理利用JDBC的批量处理功能,开发者可以优化数据操作的性能,特别是在处理大数据量时,能有效减少数据库的负担,提高系统的整体响应速度。因此,理解和掌握批量处理是每个Java数据库开发者必备的技能之一。

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    2. **预编译语句(PreparedStatement)**:预编译的SQL语句可以显著提升执行速度,同时防止SQL注入攻击。 3. **批处理操作**:允许多个SQL语句一次性提交,减少网络通信次数,提高整体执行效率。 4. **游标支持**:...

    greenplum数据库jdbc驱动下载

    查询时,任务被分解并并行执行在各个节点上,提高了处理速度。 2. **自动分区**:Greenplum支持自动分区,可以根据时间、地理位置或其他业务需求将数据分片,便于管理和查询。 3. **智能查询优化**:内置的查询...

    JDBC教程

    总结:JDBC是Java开发数据库应用的基础,通过学习JDBC,开发者可以掌握如何在Java程序中执行SQL语句,处理数据库连接和事务,以及进行性能优化和安全实践。JDBC教程PPT将深入讲解这些概念,提供实用示例,帮助你快速...

    greenplum_jdbc_5.1.4.zip

    它基于PostgreSQL,但扩展了MPP(大规模并行处理)架构,使得数据处理速度大幅提升。在大数据场景下,Greenplum能够提供高效的数据查询和分析能力。 2. **JDBC驱动的角色** JDBC(Java Database Connectivity)是...

    多线程以JDBC的方式返回海量数据

    当我们需要处理海量数据时,结合这两者可以显著提升程序的效率和响应速度。本篇将深入探讨如何利用多线程和JDBC来高效地返回大数据。 首先,让我们了解什么是JDBC。JDBC是Java平台的标准API,它允许Java程序与各种...

    jdbc jar包

    - 使用PreparedStatement而非Statement,因为预编译的SQL可以提高执行速度,并防止SQL注入。 - 批量处理(`addBatch()`和`executeBatch()`)可以减少网络通信,提高效率。 - 使用连接池,减少连接创建和销毁的时间。 ...

    jdbc_on_oracle

    2. **SQL语句执行**:介绍如何通过JDBC执行SQL语句,包括简单的SELECT、INSERT、UPDATE和DELETE语句,以及复杂的存储过程调用和批处理操作,提高数据处理效率。 3. **结果集处理**:探讨如何有效地读取和处理查询...

    如何加快JDBC设计中JSP数据库访问速度

    在提高JDBC设计中JSP数据库访问速度的过程中,我们需要关注几个关键点,包括JSP的模块化、MVC设计模式的应用、JDBC操作的优化以及使用自定义标签库(Tag Libraries)来提升代码的可读性和可维护性。 首先,JSP作为...

    sqlserver jdbc 4.2

    JDBC 4.2版本针对性能进行了优化,如改进了预编译的SQL语句处理,提升了批量操作速度。 4. **新特性**: - **JDBC 4.2规范支持**:增加了对Java 8新特性的支持,如日期时间API的增强。 - **Always Encrypted**:...

    JDBC与Hibernate区别

    在性能方面,JDBC通常在数据读写速度上占有优势,特别是当使用批处理时。而Hibernate虽然在某些情况下可能略逊一筹,但在处理复杂对象模型和持久化逻辑时,其自动化特性减少了大量手动工作。此外,Hibernate支持缓存...

    mysql-jdbc5.1.7.rar

    8. **性能优化**:5.1.7版的驱动优化了性能,减少了网络传输的数据量,提高了查询速度。此外,它还增强了错误处理和诊断能力,有助于调试和问题定位。 总的来说,MySQL JDBC 5.1.7是连接Java应用程序与MySQL数据库...

    Mysql JDBC源码 官网版

    MySQL JDBC源码是Java开发人员与...例如,你可以优化SQL语句,提高查询速度;或者对驱动进行扩展,添加自定义的功能。总的来说,阅读源码有助于深化对JDBC和数据库原理的理解,对Java数据库编程有着显著的提升作用。

    驱动程序jdbc_4.2

    3. **多语句执行**:JDBC 4.2允许在一个CallableStatement或PreparedStatement中执行多个SQL语句,提高了批量操作的效率。 4. **数组和集合的Java 8接口**:现在可以使用Java 8的List、Set、Map等接口来处理数据库...

    sqljdbc4.jar

    - 使用PreparedStatement而非Statement,因为预编译的SQL语句能避免多次解析,提高执行速度。 - 合理设置连接超时,防止因长时间无响应导致的资源浪费。 - 使用批处理和连接池技术,减少网络传输和数据库资源的...

    sql server jdbc 驱动包

    8. **性能优化**:使用`PreparedStatement`代替`Statement`,预编译SQL语句,可以提高执行速度。对于大量重复的SQL操作,预编译的语句更具优势。 9. **连接池**:在实际应用中,为了提高性能和资源利用,通常会使用...

    非常好的jdbc3.0

    Java Database Connectivity (JDBC) 是Java平台中用于与关系数据库进行交互的一种标准API,它使得Java开发者能够以一种统一的方式处理各种数据库。JDBC3.0是JDBC的一个重要版本,引入了许多增强特性,提高了数据库...

    JDBC操作(ppt)

    - 使用PreparedStatement代替Statement,预编译SQL语句可以提高执行速度。 - 执行完SQL后,及时关闭结果集、Statement和Connection,避免资源泄露。 - 考虑使用连接池(如C3P0、HikariCP)管理数据库连接,提高...

Global site tag (gtag.js) - Google Analytics