`

Oracle版本驱动中使用Java Date产生问题的解答

 
阅读更多

如果你在Oracle版本驱动中使用Java Date时产生一些问题的时候,你是否想了解不解之处,以下的文章主要是通过对Oracle版本驱动中使用Java Date的问题的实际应用的方案的介绍,来解答你在Oracle版本驱动中使用Java Date的问题在实际操作方面的问题。

这里两天都在对一条sql进行调优。该sql并不复杂,类似于

select ... from some_view union all select ... from some_table where datetime >= d1 and datetime< d2 and ....  底层使用

ibatis2.1.6 + oracle 10g 今天花了些时间继续研究这个问题,导致该问题的原因的确是“导致oracle对datetime字段进行了隐式类型转换,最终CBO未能使用该列的全局索 引”,不过问题不是出在ibatis上而是Oracle driver。设我们使用这样的sql通过绑定变量(类型为java.util.date)查询数据库,其中end_date是date类型且建立了索引。

“select count(*) from table1 where end_date >= :1 and end_date <= :2” 通常,面对这样的sql,我们希望它的执行计划走index range scan。然而在默认情况下oracle CBO是不会选择走索引地,以上面这语句为例,oracle实际走的是table full scan。为什么会这样 呢?这类问题是oracle版本在9.2以后引入了TIMESTAMP才开始出现的。

在 9.2之前,Oracle只有DATE,而没有TIMESTAMP。在jdbc preparedStatement.setTimestamp时,绑定变量的类型会被正确的设置为DATE。而在9.2之后,oracle开始支持 TIMESTAMP了,这两者都能支持精度为yyyy-MM-dd hh24:mi:ss的时间(当然TIMESTAMP能支持到纳秒级别)。

但jdbc driver的api未变同样在preparedStatement.setTimestamp时,oracle driver就得选择到底该把绑定变量的类型设置为DATE还是TIMESTAMP呢?估计是由于TIMESTAMP的精度更高,Oracle 最终默认选择了将绑定变量的类型设置为了TIMESTAMP。那么这个时候,如果面对实际属性为DATE的列,那么就会导致 oracle隐式地进行形如

“TO_TIMESTAMP(date_column) = parameter_timestamp” 转换,要 知道oracle CBO不会选择被某函数作用的列上的索引源码天空,除非是函数索引。因此,最终也会导致最上面的情况使用table full scan而不是index range scan。

Oracle版本就没有提供别的方法来正确地提供绑定变量吗?oracle提供 了几个方法来解决这个问题

1.升级到11g并使用新的正确的driver api。

2.将DATE列全都改成 TIMESTAMP列。

3.使用V8Compatible flag。


 

  1. public void setParameter(PreparedStatement ps, int i, Object parameter, String jdbcType)   
  2.     throws SQLException {   
  3.   ps.setTimestamp(i, new java.sql.Timestamp(((Date) parameter).getTime()));   
  4. }  
  5. SQL语句用了l_apiendtime>?并且使用setTimestamp会使索引失效,可以用to_date()函数来转换字符串为日期和date做比较
分享到:
评论

相关推荐

    oracle驱动的区别

    此外,还需要注意的是,随着技术的发展,Oracle不断推出新的驱动版本来修复已知的问题和提供新的功能。因此,在选择Oracle JDBC驱动时,除了考虑版本兼容性之外,还应该关注最新的版本发布信息。

    Oracle9i 安装 使用 java链接

    在这个主题中,我们将深入探讨Oracle9i的安装过程、Java链接的使用,以及如何在Oracle数据库中创建库和表以及定义字段类型。 首先,让我们来了解Oracle9i的安装步骤。安装Oracle9i通常分为以下几个阶段: 1. **...

    java代码oracle数据库批量插入

    这是为了确保Java应用程序能够识别并使用Oracle的JDBC驱动。 - 通过`DriverManager.getConnection(url, user, password);`建立数据库连接。这里的`url`、`user`和`password`是在前一步骤中定义的连接信息。 #### 4....

    java中的JDBC纯驱动方式连接Oracle数据库.docx

    ### Java中的JDBC纯驱动方式连接Oracle数据库 在Java开发中,经常需要处理与数据库的交互,而JDBC(Java Database Connectivity)就是一种用于执行SQL语句的标准Java API,它可以为多种关系数据库提供统一访问,它...

    JPublisher生成Oracle对象类型对应的Java对象例子

    JPublisher是Oracle JDBC驱动程序的一部分,它允许我们将Oracle的对象类型映射到Java类,这样我们就可以在Java应用程序中方便地操作这些对象。 标题“JPublisher生成Oracle对象类型对应的Java对象例子”指的是使用...

    java jsp sqlserver数据表转移到oracle实例 源代码

    标题中的“java jsp sqlserver数据表转移到oracle实例 源代码”表明这是一个关于使用Java和JSP技术,将SQL Server数据库中的数据表迁移至Oracle数据库的实际操作案例。这个过程通常涉及数据迁移、数据转换以及可能的...

    Mysql,Oracle,Sqlserver数据库驱动包

    2. Oracle驱动包:Oracle数据库是企业级的高端数据库系统,其Java驱动主要为ojdbc.jar。Oracle提供了多种JDBC驱动类型,如 Thin 驱动、Thin No-SSL 驱动、 Thick 驱动等,其中 Thin 驱动是最常见的,它是一个轻量级...

    java中的JDBC纯驱动方式连接Oracle数据库.pdf

    Java 中的 JDBC 纯驱动方式连接 Oracle 数据库是指使用 Java 语言编写程序来连接 Oracle 数据库的方式。该方式需要使用 Oracle 数据库厂商提供的驱动程序包来实现连接。下面是 Java 中的 JDBC 纯驱动方式连接 Oracle...

    java操作Oracle

    本文主要介绍了一些关于Java JDBC API在Oracle数据库上的使用技巧,以提升性能和实现更高效的功能。 首先,选择合适的驱动程序至关重要。Oracle提供了两种客户端驱动:OCI驱动和Thin驱动。尽管OCI驱动利用JNI与...

    java中调用oracle的存储过程和函数

    ### Java中调用Oracle的存储过程和函数 在Java应用程序中调用Oracle数据库中的存储过程或函数是一项常见的任务。这不仅能够提高代码的执行效率,还可以有效地管理事务处理,确保数据的一致性和完整性。本文将详细...

    Oracle jdbc for 11g 最新版 驱动 ojdbc6.jar

    Oracle官方11g 最新版jdbc驱动。 新特性:  1、支持JDK6,支持JDBC 4.0,新的java.sql.SQLXML类型没有被支持,是使用ojdbc6.jar来支持。... 尽量使用和数据库版本一致的驱动,有bug时,换高版本的JDBC驱动试试 。

    java、mysql以及oracle数据类型对照表

    Oracle数据库提供了更多的复杂数据类型,如OBJECT、ARRAY、REF,这些在Java中可以通过自定义类型映射或JDBC驱动的高级特性来处理。同时,Oracle的NCLOB和BFILE等非BLOB/CLOB类型用于存储特定类型的字符数据和大文件...

    用Java实现SQL_Server到Oracle数据迁移

    使用Java进行数据迁移,首先需要引入相应的数据库驱动,如JDBC驱动,分别对应SQL Server和Oracle。以下是一般步骤: - 导入JDBC驱动:对于SQL Server,通常使用`com.microsoft.sqlserver.jdbc.SQLServerDriver`;...

    java操作Oracle.docx

    Java 操作 Oracle 数据库时,我们可以通过使用 Thin 驱动程序、关闭自动提交功能、使用 Statement 对象、利用 helper 函数对动态 SQL 命令进行格式化、使用 PreparedStatement 对象提高数据库的总体效率、在成批处理...

    java c/s sql srever oracle转换

    比如,Oracle使用`TO_DATE`函数处理日期,而SQL Server使用`CONVERT`。在更新Java代码中的SQL查询时,需要考虑这些差异。 5. **存储过程和函数**:如果应用使用了存储过程,需要将SQL Server的存储过程转换为Oracle...

    java操作Oracle.pdf

    在开发 Java 软件方面,Oracle 的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets 等客户端软件,另外二种用于数据库中的 Java 存储过程等服务器端软件。在客户机端软件的开发中,我们可以...

Global site tag (gtag.js) - Google Analytics