`
yanghuidang
  • 浏览: 967948 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JDBC 的 setTimestamp 性能问题

阅读更多

偶然发现三年前的一个技术问题。当时比较匆忙,避免掉即过去了。现在 Metalink 上其实已经把这个问题作为一个 Bug 处理了。

问题描述:通过 JDBC 上来的 Java 查询应用,SQL 表现异常。表字段使用了 DATE 类型,针对该字段时间区域很小的范围查询(预期应该是走 INDEX RANGE SCAN),在 SQL Map 上指定索引,发现无效。仍然是 FULL TABLE SCAN (FTS)。

罪魁祸首:setTimestamp() 把值绑定为 TIMESTAMP 类型,这样和 DATE 类型比较的时候,CBO 就会选择全表扫描。

通过 Trace 能观察到该异常行为。TIMESTAMP 在 Oracle 的 JDBC 9.2.0.1 上就有了,连续几个版本其实都有类似的问题。

解决办法:使用 setString() 而不是 setTimestamp() 方法。

这个故事告诉我们,Oracle 的 JDBC 驱动程序其实问题挺多的。同样,TIMESTAMP 潜在的问题也不少,尽管这个数据类型已经出现多时。

分享到:
评论

相关推荐

    J2EE-JDBC学习笔记

    使用`DATE`, `TIME`, `TIMESTAMP`类型进行存储,通过`PreparedStatement`的`setDate()`, `setTime()`, `setTimestamp()`方法插入数据,以及`ResultSet`的相应`getDate()`, `getTime()`, `getTimestamp()`方法读取...

    jdbc课件——关于JDBC的基础知识

    它具有开源、免费、高性能、易用等特点,被广泛应用于互联网应用中。 - MySQL支持多种操作系统平台,如Windows、Linux、Unix等,具备良好的跨平台性。 - 默认端口为3306,初始用户为root,可以配置不同的字符集,...

    Java_JDBC学习教程 由浅入深.doc

    - **序列化读** (`SERIALIZABLE`):最严格的隔离级别,完全避免并发问题,但可能降低性能。 #### 九、PreparedStatement 接口的使用 - `PreparedStatement` 是 `Statement` 的子接口,支持预编译 SQL 语句。 - 提高...

    jdbc学习文档

    - 不支持预编译SQL语句,可能导致性能问题。 - 容易受到SQL注入攻击。 #### 四、ResultSet接口的使用详解 **4.1 ResultSet接口介绍** - `next()`:移动游标到下一行。 - `getString(int columnIndex)`:根据列...

    jsp课件 jdbc

    - 在JSP页面中嵌入Java代码,通过`<jsp:useBean>`或`<jsp:setProperty>`标签来初始化和设置JDBC连接相关对象。 - 使用`<sql:update>`和`<sql:query>`标签执行SQL操作,获取和更新数据。 - 结果集可以通过`<sql:rows>...

    Oracle Timestamp with Time zone & java

    在设置Oracle的Timestamp with Time Zone类型的值时,可以使用`setObject()`方法,传入`ZonedDateTime`对象。在从数据库查询结果获取Timestamp with Time Zone数据时,可以通过`ResultSet.getObject()`方法,然后...

    jdbc增删改查加分页

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 接着,我们讨论如何使用JDBC进行数据的增删改查: 1. **增加(Create)**:通过PreparedStatement预编译SQL语句,防止SQL注入。例如: ```java String...

    3、jsp jdbc 数据库管理器中的操作1

    - `UPDATE`: 更新现有数据,如`UPDATE lu SET password = ? WHERE id = ?`。 4. **数据库设计注意事项**: - **主键(Primary Key)**: 主键是表中唯一标识一行的字段,如`id int PRIMARY KEY AUTO_INCREMENT`,...

    jdbc连接程序实现不同数据库数据的迁移

    需要注意的是,实际操作中还应考虑数据的完整性、并发控制以及迁移过程中的数据一致性问题。此外,对于大规模数据迁移,可能还需要设计更复杂的策略,如分批迁移、增量迁移等,以确保迁移的稳定性和效率。

    快速开始使用JDBC连接Mysql数据库之简单CRUD.docx

    在Java编程中,JDBC...在实际开发中,为了提高性能和安全性,建议使用连接池管理数据库连接,并使用预编译的`PreparedStatement`来避免SQL注入问题。同时,应确保在操作完成后正确关闭数据库资源,以避免资源泄露。

    MySQL面试题(含答案)

    ID自增主键问题 **题目**: 当一张表里有ID自增主键,插入了17条记录之后,删除了第15,16,17条记录,重启MySQL后再插入一条记录,这条记录的ID是18还是15? **解答**: 在MySQL中,自增主键不会因为删除某些记录而回...

    mysql数据库实现jspsmart的2个实例

    pstmt.setTimestamp(2, new Timestamp(new Date().getTime())); pstmt.executeUpdate(); ``` 5. **文件管理** 文件上传后,你可能还需要提供一个界面让用户查看、下载或删除已上传的文件。这可以通过查询数据库...

    java调用oracle存储过程

    因为Java的Date和Oracle的TIMESTAMP有时会有类型转换问题,所以自定义PropertyEditor可以帮助我们在Java对象和数据库之间进行类型转换,确保数据的准确传递。 总结起来,Java调用Oracle存储过程涉及到JDBC、数据库...

    基于Javaweb实现ATM机系统开发实战(十三)交易记录查看实现

    transaction.setTimestamp(rs.getTimestamp("timestamp").toLocalDateTime()); transactions.add(transaction); } } catch (SQLException e) { // 处理异常 } return transactions; } ``` 在前端部分,我们...

    mysql 教程MYSQL5.0的安装

    ENUM和SET是特殊类型的字符串,用于存储预定义的枚举值或集合。 MySQL5.0的常用命令包括创建、删除数据库,切换数据库,查看数据库结构,以及使用JOIN语句进行数据查询。例如,`create database db_name default ...

    202311月最新MySQL-71到精选面试题题及答案涵编程题和存储知识点-20231120.pdf

    16. **TIMESTAMP**:TIMESTAMP在UPDATE CURRENT_TIMESTAMP上自动更新,当表中有其他字段变更时,时间戳字段会被设置为当前时间。 17. **主键与候选键**:主键是唯一标识表中一行的列,每个表只能有一个主键,候选键...

    PGSQL常见的问题

    查询性能问题可能由多种因素引起,包括查询语句本身的设计、数据分布、索引选择不当等。使用`EXPLAIN ANALYZE`可以帮助诊断查询执行的瓶颈。 #### 31. 我如何才能看到查询优化器是怎样评估处理我的查询? 通过`...

    jsp连接MySQL操作GIS地图数据实现添加point的功能代码.docx

    8. **字符编码处理**:为了避免乱码问题,JSP页面使用`request.setCharacterEncoding()`和`response.setCharacterEncoding()`设置请求和响应的字符编码为UTF-8。 9. **错误处理**:虽然示例代码中没有显示,但在...

Global site tag (gtag.js) - Google Analytics