`
wjheye
  • 浏览: 83761 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

深入 理解 Statement 和 PreparedStatement

阅读更多
一、使用Statement而不是PreparedStatement对象
JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句被多次执行选用PreparedStatement是最好的.

PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行. 例如, 假设我使用Employee ID, 使用prepared的方式来执行一个针对Employee表的查询. JDBC驱动会发送一个网络请求到数据解析和优化这个查询. 而执行时会产生另一个网络请求. 在JDBC驱动中,减少网络通讯是最终的目的. 如果我的程序在运行期间只需要一次请求, 那么就使用Statement. 对于Statement, 同一个查询只会产生一次网络到数据库的通讯.

对于使用PreparedStatement池的情况下, 本指导原则有点复杂. 当使用PreparedStatement池时, 如果一个查询很特殊, 并且不太会再次执行到, 那么可以使用Statement. 如果一个查询很少会被执行,但连接池中的Statement池可能被再次执行, 那么请使用PreparedStatement. 在不是Statement池的同样情况下, 请使用Statement.

二、使用PreparedStatement的Batch功能
Update大量的数据时, 先Prepare一个INSERT语句再多次的执行, 会导致很多次的网络连接. 要减少JDBC的调用次数改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性发送多个查询给数据库. 例如, 让我们来比较一下下面的例子.


例 1: 多次执行Prepared Statement
PreparedStatement ps = conn.prepareStatement(   
   "INSERT into employees values (?, ?, ?)");   
   
for (n = 0; n < 100; n++) {   
   
  ps.setString(name[n]);   
  ps.setLong(id[n]);   
  ps.setInt(salary[n]);   
  ps.executeUpdate();   
}   


例 2: 使用Batch

PreparedStatement ps = conn.prepareStatement(   
   "INSERT into employees values (?, ?, ?)");   
   
for (n = 0; n < 100; n++) {   
   
  ps.setString(name[n]);   
  ps.setLong(id[n]);   
  ps.setInt(salary[n]);   
  ps.addBatch();   
}   
ps.executeBatch();   


在例 1中, PreparedStatement被用来多次执行INSERT语句. 在这里, 执行了100次INSERT操作, 共有101次网络往返. 其中,1次往返是预储statement, 另外100次往返执行每个迭代. 在例2中, 当在100次INSERT操作中使用addBatch()方法时, 只有两次网络往返. 1次往返是预储statement, 另一次是执行batch命令. 虽然Batch命令会用到更多的数据库的CPU周期, 但是通过减少网络往返,性能得到提高. 记住, JDBC的性能最大的增进是减少JDBC驱动与数据库之间的网络通讯.
  注:Oracel 10G的JDBC Driver限制最大Batch size是16383条,如果addBatch超过这个限制,那么executeBatch时就会出现“无效的批值”(Invalid Batch Value) 异常。因此在如果使用的是Oracle10G,在此bug减少前,Batch size需要控制在一定的限度。
分享到:
评论

相关推荐

    如何获得PreparedStatement最终执行的sql语句

    一种可能的方法是通过日志配置,例如,启用MySQL的`Statement`和`PreparedStatement`日志,这样在执行时会打印出详细的SQL语句。 另外,开发工具如IntelliJ IDEA、Eclipse等,或者数据库管理工具如MySQL Workbench...

    练习3:使用PreparedStatement插入宠物信息.zip

    在Java编程中,...通过这个练习,你可以深入理解PreparedStatement的用法,以及如何安全地插入数据到数据库。同时,这也是一个很好的机会去学习数据库连接管理、事务控制和异常处理等Java数据库编程的基础知识。

    【性能】JDBC PreparedStatement和连接池PreparedStatement Cache学习记录

    总之,理解和充分利用`PreparedStatement`和连接池中的`PreparedStatement Cache`,能够显著提升Java应用在数据库操作上的性能,降低系统资源消耗,提升用户体验。在实际开发中,应结合具体的数据库系统和业务需求,...

    jdbc.rar_WORKING_jdbc

    在深入理解JDBC之前,我们先来了解几个基本概念: 1. **驱动程序类型**: - JDBC-ODBC桥接驱动:早期的解决方案,通过ODBC接口与数据库通信。 - 网络纯Java驱动(Type 2):使用本地协议与数据库服务器通信,但...

    jdbc 总结 有参考价值

    通过上述内容,我们了解了JDBC的运作机制,掌握了使用Statement和PreparedStatement的关键点,以及如何进行事务管理和结果集处理。这些知识对于开发和维护数据库驱动的Java应用程序具有重要的参考价值。

    JDBC PrepareStatement 使用(附各种场景 demo)

    这个资源提供的示例代码将帮助开发者深入理解如何在实际项目中运用JDBC的PrepareStatement进行MySQL操作,无论是简单的查询、更新,还是复杂的批量处理,都有详细的示例作为参考。学习并掌握这些内容,对于提升Java...

    JDBC1.zip_zip

    其中,DriverManager负责管理数据库驱动,Connection代表数据库连接,Statement和PreparedStatement用于执行SQL语句,ResultSet存储查询结果。 根据驱动程序的实现方式,JDBC驱动分为4种类型: - Type 1:纯Java ...

    000_动力节点_JDBC_源码.rar_java_jpg_noonnk4_roomqyf_动力节点源码

    - 创建Statement对象:用于执行SQL语句,分为Statement、PreparedStatement和CallableStatement三种。 - 执行SQL:调用Statement对象的executeQuery()或executeUpdate()方法执行SQL。 - 处理结果集:当执行查询...

    jdbc编程笔记(非常难得的资源)

    **JDBC编程笔记** JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何连接数据库的应用程序...这份笔记详尽地介绍了JDBC的关键概念和实践技巧,有助于读者深入理解并有效运用JDBC进行数据库操作。

    JDBC与Java数据库程序设计_0.rar_JAVA数据库_java huffman_java 数据库_jdbc_数据库程序

    JDBC的核心组件包括DriverManager、Connection、Statement、PreparedStatement和ResultSet等。 1. DriverManager:这是JDBC中的一个关键类,负责管理数据库驱动程序。当程序需要与数据库建立连接时,会通过...

    java数据库连接方法

    主要组件包括DriverManager、Connection、Statement、PreparedStatement和ResultSet等。 2. DriverManager类: DriverManager是JDBC的入口点,负责管理数据库驱动。在程序启动时,我们通常会通过Class.forName()...

    java的JDBC连接

    它包括了多个接口和类,如Connection、Statement、PreparedStatement、ResultSet等,这些组件构成了JDBC的核心。 二、JDBC工作流程 1. 加载驱动:在使用JDBC前,我们需要加载对应的数据库驱动,这通常通过Class.for...

    数据库连接

    4. 创建Statement或PreparedStatement:根据需求创建Statement对象执行简单的SQL,或者使用PreparedStatement对象执行预编译的SQL,以提高性能和安全性。 5. 执行SQL:调用Statement或PreparedStatement的...

    Accp8.0\S2\使用Java实现数据库编程 第二章

    1. JDBC基础:理解JDBC API的核心组件,如DriverManager、Connection、Statement、PreparedStatement和ResultSet。学习如何加载数据库驱动,建立与数据库的连接,并执行SQL语句。 2. 数据库连接池:了解如何使用...

    JDBC 入门教程内含源码以及说明书可以自己运行复现.zip

    本教程旨在帮助初学者深入理解Java数据库连接(Java Database Connectivity,简称JDBC)的基础知识,通过源码实践和详细的说明书,你可以自行运行示例,加深对JDBC的理解。以下将分别介绍JDBC的核心概念、接口、数据...

    JavaJDBC实验

    在实验中,你可以尝试实现一个简单的数据库连接示例,如创建表、插入数据、查询数据和更新数据等操作,从而对JDBC有更深入的理解。 通过这个实验,初学者不仅可以熟悉JDBC的基本操作,还能理解数据库连接的概念,...

    Lab3-JDBC-code_jdbc_

    在本实验“Lab3-JDBC-code_jdbc_”中,我们将深入理解JDBC的核心概念、工作原理以及如何使用JDBC进行数据库操作。 首先,JDBC提供了七种主要接口和类,它们构成了JDBC API的基础: 1. **DriverManager**: 这是JDBC...

    完整版 Java编程基础入门教程 Java语言程序设计 第11章_数据库的连接(共36页).ppt

    学习这一章的内容,开发者应深入理解JDBC的工作原理,熟悉各种数据库连接模式,掌握JDBC API的使用,并能编写出高效、健壮的数据库应用程序。通过实践,可以更好地理解和应用这些知识,为后续的Java数据库编程打下...

    (彭涛注非常好的资料)跟姐姐学JDBC.rar

    这份资料可能由彭涛精心整理,旨在帮助初学者或有经验的开发者深入理解并熟练掌握JDBC技术。 在学习JDBC时,首先要了解其基本概念。JDBC提供了一种标准的API,使得Java程序能够连接到数据库、执行SQL语句、处理结果...

    JDBC数据库操作

    3. 创建Statement或PreparedStatement:根据需求创建Statement或PreparedStatement对象。 4. 执行SQL:调用Statement或PreparedStatement的方法执行SQL语句。 5. 处理结果:如果SQL是查询,获取并处理ResultSet。 6....

Global site tag (gtag.js) - Google Analytics