JPA Hibernate + UCP Oracle。从save方法执行的查询不使用表的索引

时间:2017-07-03 11:34:22

标签: spring oracle hibernate jpa ucp

我正在使用接口CRUDRepository,以便在注入Repository的其他类中使用save方法。

这个方法执行insert和select来检索从数据库插入的这个对象,我的意思是。

执行的查询非常简单:

select auditoriab0_.adb_seqitm as adb_seqitm1_1_0_,
 auditoriab0_.adb_codprv as adb_codprv2_1_0_, auditoriab0_.adb_ideses as adb_ideses3_1_0_,
 auditoriab0_.adb_locata as adb_locata4_1_0_, auditoriab0_.adb_rqores as adb_rqores5_1_0_,
 auditoriab0_.adb_rstime as adb_rstime6_1_0_, auditoriab0_.adb_subprv as adb_subprv7_1_0_,
 auditoriab0_.adb_swierr as adb_swierr8_1_0_, auditoriab0_.adb_tiptrz as adb_tiptrz9_1_0_,
 auditoriab0_.adb_ubitrz as adb_ubitrz10_1_0_, auditoriab0_.adb_xmltxt as adb_xmltxt11_1_0_
 from nwt00.auditoria_bus_gsi auditoriab0_ where auditoriab0_.adb_seqitm=:p1

adb_seqitm列的位置和索引(它是表的主键)。

例如,如果在SQLDeveloper上执行此查询,则解释计划是正确的(由rowid访问)。

但是,如果此查询由hibernate执行,则结果为完全扫描。

你能帮我解决这个问题吗?我将不胜感激,因为我没有在互联网上看到这个特定问题的真正解决方案。

提前谢谢。

ucp(通用连接池)池会发生此行为。我的数据库bean配置是下一个(变量由application.properties文件设置):

UniversalConnectionPoolManager mgr;
        try {
            mgr = UniversalConnectionPoolManagerImpl. getUniversalConnectionPoolManager();
            mgr.destroyConnectionPool("hotels");
        } catch (UniversalConnectionPoolException e) {
        }
        PoolDataSourceImpl poolDataSource = (PoolDataSourceImpl) PoolDataSourceFactory.getPoolDataSource();
        poolDataSource.setUser(userName);
        poolDataSource.setPassword(passWord);
        poolDataSource.setURL(url);
        poolDataSource.setConnectionFactoryClassName(driver);
        poolDataSource.setConnectionPoolName("hotels");
        poolDataSource.setInitialPoolSize(initialNumConnections);
        poolDataSource.setMinPoolSize(minNumConnections);
        poolDataSource.setMaxPoolSize(maxNumConnections);
        poolDataSource.setMaxConnectionReuseTime(reconnectTime);
        poolDataSource.setMaxConnectionReuseCount(maxReconnectCount);
        poolDataSource.setTimeToLiveConnectionTimeout(timeToLive);
        poolDataSource.setConnectionWaitTimeout(connectWaitTimeOut);
        poolDataSource.setValidateConnectionOnBorrow(true);
        poolDataSource.setInactiveConnectionTimeout(inactiveConnectionTimeOut);
        Properties properties = new Properties();
        properties.put("v$session.program", "xxxx");
        properties.put("defaultNChar", "false");
        poolDataSource.setConnectionProperties(properties );

我正在使用Spring Boot + Spring Data JPA。这些是我对pom.xml的依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ucp</artifactId>
        <version>11.2.0.4.0</version>
    </dependency>

1 个答案:

答案 0 :(得分:0)

@krokodilko正如您所料,错误发生在数据库类型和java类型之间。在DDBB中,此字段是String(varchar2(15))。在Java中,此字段使用long类型映射。我猜hibernate或数据库正在进行一次破坏索引的转换。我已经按字符串类型更改了java类型,并且查询工作成功。解释计划是正确的。