- 浏览: 153166 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xfei6868:
fengyie007 写道xfei6868 写道请问你有没有结 ...
maven jetty7 插件设置 -
fengyie007:
xfei6868 写道请问你有没有结合 web.xml 配置 ...
maven jetty7 插件设置 -
xfei6868:
请问你有没有结合 web.xml 配置 和 spring结合 ...
maven jetty7 插件设置 -
nianzhi:
tomcat7.0之后这样配置就不行了。根本没有作用。
tomcat地址栏传中文 -
nianzhi:
...
tomcat地址栏传中文
介绍开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你.本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:
以下这些一般性原则可以帮助你解决一些公共的JDBC系统的性能问题. 选用JDBC对象和方法本节的指导原则将帮助你在选用JDBC的对象和方法时哪些会有最好的性能. 在存储过程中使用参数标记作为参数当 调用存储过程时, 应总是使用参数标记(?)来代替字面上的参数. JDBC驱动能调用数据库的存储过程, 也能被其它的SQL查询执行, 或者直接通过远程进程调用(RPC)的方式执行. 当你将存储过程作为一个SQL查询执行时, 数据库要解析这个查询语句, 校验参数并将参数转换为正确的数据类型. 要记住, SQL语句总是以字符串的形式送到数据库, 例如, “{call getCustName (12345)}”. 在这里, 即使程序中将参数作为整数赋给了getSustName, 而实现上参数还是以字符串的形式传给了服务器. 数据库会解析这个SQL查询, 并且根据metadata来决定存储过程的参数类型, 然后分解出参数"12345", 然后在最终将存储过程作为一个SQL查询执行之前将字串'12345’转换为整型数. 按RPC方式调用时, 之前那种SQL字符串的方式要避免使用. 取而代之, JDBC驱动会构造一个网络packet, 其中包含了本地数据类型的参数,然后执行远程调用. 案例 1 在这个例子中, 存储过程不能最佳的使用RPC. 数据库必须将这作为一个普通的语言来进行解析,校验参数类型并将参数转换为正确的数据类型,最后才执行这个存储过程.
案例 2 在这个例子中, 存储过程能最佳的执行RPC. 因为程序避免了字面的的参数, 使用特殊的参数来调用存储过程, JDBC驱动能最好以RPC方式直接来执行存储过程. SQL语言上的处理在这里被避免并且执行也得到很大的改善.
使用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
例 2: 使用Batch
在 例 1中, PreparedStatement被用来多次执行INSERT语句. 在这里, 执行了100次INSERT操作, 共有101次网络往返. 其中,1次往返是预储statement, 另外100次往返执行每个迭代. 在例2中, 当在100次INSERT操作中使用addBatch()方法时, 只有两次网络往返. 1次往返是预储statement, 另一次是执行batch命令. 虽然Batch命令会用到更多的数据库的CPU周期, 但是通过减少网络往返,性能得到提高. 记住, JDBC的性能最大的增进是减少JDBC驱动与数据库之间的网络通讯. 选择合适的光标类型选择适用的光标类型以最大限度的适用你的应用程序. 本节主要讨论三种光标类型的性能问题. 对 于程序中要求与数据库的数据同步以及要能够在结果集中前后移动光标, 使用JDBC的Scroll-Insensitive型光标是较理想的选择. 此类型的光标在第一次请求时就获取了所有的数据(当JDBC驱动采用'lazy'方式获取数据时或许是很多的而不是全部的数据)并且储存在客户端. 因此, 第一次请求会非常慢, 特别是请求长数据时会理严重. 而接下来的请求并不会造成任何网络往返(当使用'lazy'方法时或许只是有限的网络交通) 并且处理起来很快. 因为第一次请求速度很慢, Scroll-Insensitive型光标不应该被使用在单行数据的获取上. 当有要返回长数据时, 开发者也应避免使用Scroll-Insensitive型光标, 因为这样可能会造成内存耗尽. 有些Scroll-Insensitive型光标的实现方式是在数据库的临时表中缓存数据来避免性能问题, 但多数还是将数据缓存在应用程序中. Scroll -Sensitive型光标, 有时也称为Keyset-Driven光标, 使用标识符, 像数据库的ROWID之类. 当每次在结果集移动光标时, 会重新该标识符的数据. 因为每次请求都会有网络往返, 性能可能会很慢. 无论怎样, 用无序方式的返回结果行对性能的改善是没有帮助的. 现 在来解释一下这个, 来看这种情况. 一个程序要正常的返回1000行数据到程序中. 在执行时或者第一行被请求时, JDBC驱动不会执行程序提供的SELECT语句. 相反, 它会用键标识符来替换SELECT查询, 例如, ROWID. 然后修改过的查询都会被驱动程序执行,跟着会从数据库获取所有1000个键值. 每一次对一行结果的请求都会使JDBC驱动直接从本地缓存中找到相应的键值, 然后构造一个包含了'WHERE ROWID=?'子句的最佳化查询, 再接着执行这个修改过的查询, 最后从服务器取得该数据行. 当程序无法像Scroll-Insensitive型光标一样提供足够缓存时, Scroll-Sensitive型光标可以被替代用来作为动态的可滚动的光标. 使用有效的getter方法JDBC 提供多种方法从ResultSet中取得数据, 像getInt(), getString(), 和getObject()等等. 而getObject()方法是最泛化了的, 提供了最差的性能。 这是因为JDBC驱动必须对要取得的值的类型作额外的处理以映射为特定的对象. 所以就对特定的数据类型使用相应的方法. 要更进一步的改善性能, 应在取得数据时提供字段的索引号, 例如, getString(1), getLong(2), 和getInt(3)等来替代字段名. 如果没有指定字段索引号, 网络交通不会受影响, 但会使转换和查找的成本增加. 例如, 假设你使用getString("foo") ... JDBC驱动可能会将字段名转为大写(如果需要), 并且在到字段名列表中逐个比较来找到"foo"字段. 如果可以, 直接使用字段索引, 将为你节省大量的处理时间. 例如, 假设你有一个100行15列的ResultSet, 字段名不包含在其中. 你感兴趣的是三个字段 EMPLOYEENAME (字串型), EMPLOYEENUMBER (长整型), 和SALARY (整型). 如果你指定getString(“EmployeeName”), getLong(“EmployeeNumber”), 和getInt(“Salary”), 查询旱每个字段名必须被转换为metadata中相对应的大小写, 然后才进行查找. 如果你使用getString(1), getLong(2), 和getInt(15). 性能就会有显著改善. 获取自动生成的键值有许多数据库提供了隐藏列为表中的每行记录分配一 个唯一键值. 很典型, 在查询中使用这些字段类型是取得记录值的最快的方式, 因为这些隐含列通常反应了数据在磁盘上的物理位置. 在JDBC3.0之前, 应用程序只可在插入数据后通过立即执行一个SELECT语句来取得隐含列的值.
这 种取得隐含列的方式有两个主要缺点. 第一, 取得隐含列是在一个独立的查询中, 它要透过网络送到服务器后再执行. 第二, 因为不是主键, 查询条件可能不是表中的唯一性ID. 在后面一个例子中, 可能返回了多个隐含列的值, 程序无法知道哪个是最后插入的行的值. (译者:由于不同的数据库支持的程度不同,返回rowid的方式各有差异。在SQL Server中,返回最后插入的记录的id可以用这样的查询语句:SELECT @IDENTITY ) JDBC3.0规范中的一个可选特性提供了一种能力, 可以取得刚刚插入到表中的记录的自动生成的键值.
现在, 程序中包含了一个唯一性ID, 可以用来作为查询条件来快速的存取数据行, 甚至于表中没有主键的情况也可以. 这种取得自动生成的键值的方式给JDBC的开发者提供了灵活性, 并且使存取数据的性能得到提升. 选择合适的数据类型接 收和发送某些数据可能代价昂贵. 当你设计一个schema时, 应选择能被最有效地处理的数据类型. 例如, 整型数就比浮点数或实数处理起来要快一些. 浮点数的定义是按照数据库的内部规定的格式, 通常是一种压缩格式. 数据必须被 解压和转换到另外种格式, 这样它才能被数据的协议处理. 获取ResultSet由于数据库系统对可滚动光标的支持有 限, 许多JDBC驱动程序并没有实现可滚动光标. 除非你确信数据库支持可滚动光标的结果集, 否则不要调用rs.last()和rs.getRow()方法去找出数据集的最大行数. 因为JDBC驱动程序模拟了可滚动光标, 调用rs.last()导致了驱动程序透过网络移到了数据集的最后一行. 取而代之, 你可以用ResultSet遍历一次计数或者用SELECT查询的COUNT函数来得到数据行数. 通常情况下,请不要写那种依赖于结果集行数的代码, 因为驱动程序必须获取所有的数据集以便知道查询会返回多少行数据. |
发表评论
-
jrebel 5.0.0 破解
2012-06-17 16:06 2236下载地址: http://download.csdn.net ... -
jetty服务器java.sql.SQLException: Already closed处理
2012-04-19 17:24 2068在jetty的数据源配置中添加如下配置 <Set n ... -
mvn install
2011-08-05 15:51 0mvn install:install-file -Dgrou ... -
weblogic中使用commons-lang包报java.lang.NoSuchMethodError解决办法
2010-08-31 17:01 5257在weblogic中发布的应用使用了commo ... -
java RSA密钥生成
2010-07-23 14:12 4895在网上找了下RSA的密钥的创建,结果全是用java序列化Pub ... -
maven jetty7 插件设置
2010-07-23 13:55 5232jetty-maven-plugin设置: <plug ... -
eclipse常用插件更新地址
2009-11-11 09:37 1790findbugs http://findbugs.cs.umd ... -
java class文件魔数与版本对应
2009-10-21 14:36 1959major minor Java platform vers ... -
maven配置文件
2009-10-18 23:43 1429完整的自定义目录结构的maven配置文件。 ... -
eclipse远程调试
2009-07-17 01:01 2275set JAVA_OPTS=-server -Xdebug - ... -
删除eclipse3.4中的P2更新管理器
2009-04-12 18:14 1772原文地址:Equinox p2 Removal ... -
jdk1.3中保存jpeg图片
2009-04-09 15:21 1286因为在jdk1.3中没有ImageIO类,只能使用下面的方法来 ... -
JSR大全
2009-04-01 13:32 20691 ,Real-time Specification for ... -
apache commons-lang-2.3 StringUtils.java 学习笔记
2009-04-01 13:17 0StringUtils中方法的操作对象是java.lang.S ... -
java问题收集
2009-01-15 11:54 1010所有字节码都是用sun虚拟机编译的.以下内容都是在网上查阅,加 ... -
eclipse常用插件(Update sites)
2008-12-30 14:19 1604findbugs http://findbugs.cs.umd ... -
weblogic 9.2 发布EJB
2008-12-29 16:05 1585将EJB的jar包放到domain的autodeploy目录下 ... -
confluence2.x 破解
2008-12-26 16:06 1271首先去官方网站下载confluence-2.x的安装包。 然后 ... -
eclipse.ini内存设置各参数含义
2008-11-10 13:13 5351-vmargs -Xms128M -Xmx512M -XX:P ... -
Java性能优化技巧集锦
2008-09-07 03:51 850可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的 ...
相关推荐
标题中的“优化JDBC性能的三大技巧”是指在开发基于Java的JDBC应用程序时,为了提升性能而采取的关键策略。这些技巧主要集中在正确使用数据库MetaData方法、只获取必要的数据以及选择最佳性能的功能,并且有效管理...
以下是一些关键的JDBC使用技巧: 1. **加载驱动**: - `Class.forName()` 方法是传统方式加载数据库驱动,它会根据指定的全类名创建类的实例,并确保驱动被注册到`DriverManager`。现在通常不推荐使用`newInstance...
为了充分利用Oracle数据库的强大能力,开发者需要掌握高性能的JDBC编程技巧,特别是连接池和语句池的运用,这两者能显著提升数据库密集型应用程序的效率。 #### 二、连接池技术解析 **2.1 连接池的概念** 连接池...
9. **性能优化**:JDBC提供了多种优化技巧,如关闭不再需要的资源(如结果集、Statement和连接),使用连接池来重用连接,以及合理使用`PreparedStatement`避免SQL注入。 10. **JDBC API的扩展**:随着技术的发展,...
### JDBC连接数据库技巧集萃 在Java开发领域中,JDBC(Java Database Connectivity)是一种用于执行...通过掌握这些技巧,开发者能够更加高效、安全地利用JDBC连接和操作各种数据库,从而提升应用程序的性能和稳定性。
### JDBC技巧汇总知识点详解 #### 一、JDBC概述 **定义:** JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,它为多种关系数据库提供统一访问方式。JDBC由一系列Java语言...
10、监控和调整JDBC性能 了解和监控JDBC的性能至关重要。可以使用JDBC的Profiler工具,或者数据库自带的性能分析工具,如Oracle的DBMS_profiler,来跟踪SQL语句的执行时间,找出性能瓶颈。根据分析结果,调整SQL语句...
### 通过JDBC连接Oracle数据库的十大技巧 #### 1. 使用Thin驱动程序 在Java客户端软件开发过程中,Oracle提供了多种驱动程序供...通过运用上述技巧,可以显著提升通过JDBC连接Oracle数据库的应用程序的性能和稳定性。
本文将详细介绍三个主要的JDBC性能优化技巧,并提供了一些通用的准则,以帮助开发者提高JDBC应用程序的运行效率。 首先,正确使用数据库MetaData方法是关键。MetaData方法通常用于获取数据库表、列、索引等元数据...
### JDBC优化技巧 1. **批处理**:通过Statement对象的`addBatch()`和`executeBatch()`方法,可以将多个SQL语句作为一个批次执行,提高性能。 2. **使用PreparedStatement**:预编译SQL语句,减少解析次数,提升...
JDBC(Java Database Connectivity)是Java编程语言中用于...了解这些经验技巧有助于更有效地利用JDBC进行数据库操作,提升应用程序的稳定性和性能。在实际开发中,应结合具体项目需求和数据库特性,灵活运用这些技巧。
此外,该教程还强调了最佳实践和性能优化技巧,帮助开发者更好地理解和掌握JDBC的精髓。 总之,尚硅谷JDBC视频教程是一套全面且实用的学习资源,无论是对于初学者还是有一定经验的开发者来说,都是一个很好的起点。...
五、JDBC优化技巧 1. 使用PreparedStatement以减少SQL解析时间,避免SQL注入攻击。 2. 批量处理:通过`Statement.addBatch()`和`Statement.executeBatch()`批量执行SQL,提高效率。 3. 数据库连接池:使用...
5. **性能优化**:提供JDBC查询优化策略,如使用PreparedStatement、批处理、并行查询等技术,减少网络延迟,提升应用程序响应速度。 6. **安全性与最佳实践**:强调在使用JDBC时的安全考虑,如SQL注入防护、权限...
9. **JDBC优化技巧** - 使用PreparedStatement而非Statement,减少SQL解析次数。 - 适当调整数据库连接池大小,避免过多的连接创建与销毁。 - 使用批处理处理大量数据操作。 - 及时关闭数据库资源,防止资源泄露...
JDBC优化技巧** - 使用PreparedStatement而非Statement,因为预编译的SQL可以提高执行速度,并防止SQL注入。 - 批量处理(`addBatch()`和`executeBatch()`)可以减少网络通信,提高效率。 - 使用连接池,减少连接...
在实际开发中,确保正确配置JDBC驱动,理解JDBC API的使用,以及掌握良好的数据库操作规范,都是提升Java应用与SQL Server数据库交互性能的关键。在升级JDK版本时,务必检查JDBC驱动的兼容性,以保证应用程序的正常...
### 学习JDBC与Oracle的若干技巧 在IT领域,特别是对于数据库...综上所述,通过对JDBC与Oracle数据库的深入了解和合理运用上述技巧,可以极大地提升应用程序的性能和稳定性。希望本文能为您的学习之旅提供有益的帮助。