- 浏览: 1197654 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
JDBC2.0后提出了三种不同的cursor类型,用户代码可以在创建Statement指定cursor类型,如下: Statement createStatement( int resultSetType, int resultSetConcurrency)
cursor类型
ResultSet.TYPE_FORWARD_ONLY
默认的cursor类型,仅仅支持向前forward,不支持backforward,random,last,first操作,类似单向链表。 TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型
ResultSet.TYPE_SCROLL_INSENSITIVE
支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是不敏感,不可见的。
ResultSet.TYPE_SCROLL_SENSITIVE
支持backforward,random,last,first操作,对其它数据session对选择数据做出的更改是敏感,可见的。
分析
众所周知,JDBC对数据库进行数据查询时,数据库会创建查询结果的cache和cursor。而数据库的cursor是不支持backforward,random,last,first操作,仅仅只支持向前forward。那么TYPE_SCROLL_INSENSITIVE是如何实现支持backforward,random,last,first的呢?很简单,TYPE_SCROLL_INSENSITIVE的Statement查询把所有fetch的记录都缓存到JVM的Resultset对象内,如果有10个记录,直接跳到最后记录,TYPE_SCROLL_INSENSITIVE方式下把fetch所有记录到jvm端,并缓存下来,再进行random就是在数据库数组里面进行的。这也是TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型原因,如果要做一些复杂的功能,必然是要牺牲一些效率的。 那么为什么TYPE_SCROLL_INSENSITIVE对选择数据做出的更改是不敏感,不可见的呢?前面提到,JDBC对数据库进行数据查询时,数据库会创建查询结果的cache和cursor,如下面sql: select name,id from foo 用jdbc执行上面的sql语句时,数据库会把foo表所有记录的name和id字段缓存到cache中,之后cache和真正的数据库数据文件没有任何联系了,foo表发生的改变在查询完成后不会自动同步到cache上去,因此TYPE_SCROLL_INSENSITIVE对选择数据做出的更改是不敏感,不可见。 那么TYPE_SCROLL_SENSITIVE是怎么做到其它数据session对选择数据做出的更改是敏感,可见的。上面的sql语句用TYPE_SCROLL_SENSITIVE的Statement来执行,会转化成以下的sql语句: select rowid from foo 数据库这时候是把foo表所有记录的rowid缓存到cache中,用户代码在fetch记录时,再继续做以下查询: select name,id from foo where rowid=? 因此这时候发生的查询是实时从真正的数据库数据文件中取,因此对期间发生的数据更改是可见的,敏感的。但是这种可见性仅限于update操作,而insert和delete同样是不可见的。因为如果查询发生在insert之前,insert生成的rowid并不会反应在cache中的rowid结果集上。在一个记录的rowid已经缓存到cache中,这时候被删除了,但一般数据库的删除是标记删除,也就是说rowid对应那行记录并没有真正从数据库文件中抹去,一般是可以再次取到记录的。
总结
TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型,也是最常用的选择。 TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的记录实体,在大量记录集返回时慎用。 TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的记录rowid,需要进行二次查询,效率最低,开销最大
评论
批处理更新 ***
可更新结果集
1、批处理更新
Statement
addBatch(String sql), 方法会在批处理缓存中加入一条sql语句
executeBatch() ,执行批处理缓存中的所有sql语句。
PreparedStatement
addBatch() 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
executeBatch() 将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
PreparedStatement中使用批量更新时,要先设置好参数后使用addBatch()方法加入缓存。
注意:批量更新中只能使用更新或插入语句
execute(String sql),这个方法的返回值是boolean类型,如果返回true就表示sql是一个select语句,可以通过getResultSet()获得结果集,如果是false,sql就是DML语句或者是DDL语句。
2、可滚动结果集(可双向滚动),这种结果集不但可以双向滚动,相对定位,绝对定位,并且可以修改数据信息。
滚动特性
next(),此方法是使游标向下一条记录移动。
previous() ,此方法可以使游标上一条记录移动,前提前面还有记录。
absolute(int row),可以使用此方法跳到指定的记录位置。定位成功返回true,不成功返回false,返回值为false,则游标不会移动。
afterLast() ,游标跳到最后一条记录之后。
beforeFirst() ,游标跳到第一条记录之前。(跳到游标初始位)
first(),游标指向第一条记录。
last(),有彪指向最后一条记录。
relative(int rows) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向下移动指定值,参数为负,游标从当前位置向上移动指定值。
TYPE_FORWARD_ONLY ,该常量指示指针只能向前移动的 ResultSet 对象的类型。
TYPE_SCROLL_INSENSITIVE ,该常量指示可滚动但通常不受其他的更改影响的 ResultSet 对象的类型。
TYPE_SCROLL_SENSITIVE ,该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。
要使用可滚动结果集时,要在Statement创建时指定参数,才可以使用
Statement st=null;
st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)
ResultSet结果集中,先使用moveToInsertRow(),将游标移到和结果集结构类似的缓冲区中
然后可以使用updateXxx(int column,columnType value)方法来更新指定列数据,
再使用insertRow() 方法插入记录,
最后将游标指回原位,moveToCurrentRow() 。
能否使用可更新结果集,要看使用的数据库驱动是否支持,
还有只能用于单表且表中有主键字段(可能会是联合主键),不能够有表连接,会取所有非空字段且没有默认值。
能否使用JDBC2.0 ResultSet的新特性要看数据库驱动程序是否支持。
3、SQL3.0中的行类型
Array,数组
Sturct,结构
Blob,大的二进制数据文件。
Clob,大文本文件对象。
在使用上述大对象的时候,在使用JDBC插入记录时要先插入一个空的占位对象,然后使用
select blobdata from t_blob where id = " + id + " for update 这样的语法来对获得的大对象,进行实际的写入操作 Blod通过getBinaryOutputStream()方法获取流进行写入。getBinaryStream()方法获得流来获取blob中存储的数据。
clob的操作也和blob相同。getAsciiStream() 方法用于读取存储的文本对象,getAsciiOutputStream()方法之获得流用来向文件对象写入的。
发表评论
-
Hibernate的拦截器和监听器
2009-11-02 14:13 2105最近项目需要,用到了Hibernate的拦截器和监听器,有些小 ... -
深入 理解 Statement 和 PreparedStatement
2009-07-20 10:26 2436翻译:陈先波(turbochen@163.com)阅读原文:h ... -
开发者请注意oracle jdbc的resultSet.last()方法的效率问题
2009-07-20 10:20 2772在使用Hibernate分页器时 ... -
hibernate ScrollableResults 中CacheMode 和 ScrollMode 介绍
2009-07-20 09:26 2608CacheMode.GET - 从二级缓存中读取数据,仅在数 ... -
Hibernate中Criteria的完整用法
2009-06-21 20:13 1202Hibernate中Criteria的完整用法2008年07 ... -
Hibernate 深入研究之 Criteria
2009-06-21 17:02 1527最近在项目中使用 Spring 和 Hibernate 进行 ... -
Hibernate3的DetachedCriteria支持
2009-06-20 19:07 2770Hibernate3支持DetachedCriteria,这是 ... -
Hibernate Annotation几种关联映射
2009-04-26 02:10 1843Hibernate Annotation几种关联映射 一对一 ... -
HibernateTemplate中HibernateCallback的事务
2009-03-08 03:41 2353目的:使用HibernateTemplate执行execute ... -
关于hibernate的缓存和CRUD
2009-03-08 02:05 1126hibernate作为一种现在 ... -
EJB3/JPA Annotations 学习
2009-03-07 15:43 2416Document file and example: Hibe ... -
java回调机制及Hibernate中的HibernateTemplate实现
2009-03-06 20:42 2009谈谈回调吧,以前学java的时候居然没接触到这个词汇,汗,最近 ... -
hibernate大对象类型映射
2009-02-02 23:28 1805hibernate大对象类型映射 ... -
Hibernate二级缓存使用手册
2009-02-02 23:16 18621启用Hibernate二级缓存 Hiberna ... -
Hibernate 多对多单向关联
2009-02-02 02:17 1550Hibernate 多对多单向关联 一、模型介绍 多个人 ... -
Hibernate对应关系详解
2009-02-02 02:15 1192many-to-one节点有以下属性(摘自Hibernate文 ...
相关推荐
2. **ResultSet的增强**:提供了scrollable和updatable的ResultSet。Scrollable ResultSet允许开发者前后移动结果集,而不仅仅是按顺序读取。Updatable ResultSet则允许在结果集中直接修改数据,然后通过ResultSet的...
这个全面的JDBC资源集合旨在为不同水平的开发者提供深入理解和使用JDBC所需的知识,无论你是初学者还是有一定经验的程序员,都可以从中受益。 **一、JDBC基础** 1. **JDBC驱动**: JDBC驱动是Java与数据库之间的桥梁...
- 游标和Scrollable ResultSet - JDBC的并发和多线程支持 - JDBC的元数据查询 - SQL的存储过程调用 - 高级连接池配置 综上所述,JDBC是Java程序员掌握数据库操作的必备技能,其丰富的API和灵活的特性使得Java应用...
首先,让我们深入了解`sqljdbc4.jar`中的关键组件和功能: 1. **连接管理**:`com.microsoft.sqlserver.jdbc.SQLServerDriver`类是JDBC驱动的核心,实现了`java.sql.Driver`接口。通过调用`Class.forName(...
- 当处理大量数据时,考虑使用ResultSet的scrollable和updatable特性,或者使用流式ResultSet以降低内存消耗。 - 安全性:避免硬编码数据库凭证,使用加密或连接池管理用户凭据。 7. **JDBC驱动的版本管理**: ...
对于大数据量的查询,可以使用ResultSet的scrollable和updatable特性,或者通过流处理减少内存消耗。 `sqljdbc.jar`的源码分析可以帮助开发者更深入地理解其内部工作原理,从而优化性能或解决特定问题。通过查看...
本教材《JDBC API数据库编程实作教材》深入浅出地讲解了如何利用JDBC进行数据库编程。 1. **JDBC基础** - JDBC API的核心是Java.sql包,其中包含了DriverManager、Connection、Statement、ResultSet等关键接口和类...
《JDBC 3.0 高级编程》是一部深入探讨Java数据库连接(JDBC)技术的著作,尤其关注JDBC 3.0版本的特性与实践。本资源包含丰富的学习代码,旨在帮助开发者从初级到高级,全面掌握JDBC的核心知识。 JDBC是Java语言中...
本篇将围绕“jdbc示例代码”这一主题,深入探讨相关的知识点,包括batch处理、滚动游标、事务管理和DML操作,以及PreparedStatement的使用。 1. **Batch处理**: 在批量处理中,我们可以通过JDBC API一次性提交多...
3. **结果集处理**:JDBC提供了多种处理结果集的方式,如ForwardOnly、Scrollable、Updatable等,满足不同场景需求。`ResultSet.TYPE_FORWARD_ONLY`是默认模式,只能向前滚动;`ResultSet.TYPE_SCROLL_INSENSITIVE`...
**JDBC(Java Database Connectivity)**是Java编程语言中用于规范...通过对博客中的JDBC源码进行学习,我们可以深入理解JDBC的工作原理,提升数据库操作的技能,同时也能更好地应用到实际项目中,提高代码质量和性能。
《Java Enterprise 最佳实践》是Java开发者们深入理解企业级应用开发的重要参考资料,尤其是其中的JDBC最佳实践部分,对于数据库交互的优化和性能提升有着关键性的影响。JDBC(Java Database Connectivity)是Java...
2. **结果集缓存**:使用ResultSet的scrollable模式和类型,可以实现结果集的缓存,减少对数据库的压力。 3. **连接池**:通过DataSource管理连接,复用数据库连接,减少创建和关闭连接的开销。 总之,JDBC为Java...
- Resultset的scrollable和updatable特性允许对结果集进行滚动和修改。 - PreparedStatement的batchUpdate()方法支持批量操作。 - Connection的prepareCall()用于处理存储过程。 9. JDBC的最佳实践 - 使用...
如果`hibernate.jdbc.use_scrollable_resultset`配置为`true`,则Hibernate会尝试使用JDBC的`ResultSet`接口提供的`absolute`方法直接跳转到指定的位置,从而实现快速定位和分页。 ```java if (session.getFactory...
**JDBC驱动详解** Java Database Connectivity (JDBC) 是Java平台中用于与各种数据库进行交互的一...理解并正确使用不同类型的JDBC驱动,以及掌握其工作原理和优化技巧,对于提升应用性能和保证数据安全具有重要意义。
本文将深入探讨标题和描述中提到的“com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作”这一异常,以及如何在使用Hibernate、Struts进行分页时避免这一问题。我们将从异常的根本原因...
可以使用ResultSet的scrollable功能,按需加载数据,或者使用流式处理(ResultSet.FETCH_FORWARD和ResultSet.CONCUR_READ_ONLY),避免一次性加载所有数据。 5. **关闭资源**:每次操作完数据库后,确保正确关闭...
Oracle JDBC驱动支持多种类型的游标,如ForwardOnly、Scrollable等。 - 错误处理:在处理数据库操作时,可能会遇到各种错误。Oracle JDBC驱动提供了`SQLException`类来捕获和处理这些异常。 - 批量处理(Batch ...
5. **结果集的迭代优化**:理解并使用ResultSet的scrollable和forward-only模式,以及fetch size属性,优化数据读取性能。 6. **异常处理**:学习如何优雅地处理JDBC操作中可能出现的SQLException,避免程序中断。 ...