JPA Hibernate + Оракул Оракул. Запрос, выполненный из метода сохранения, не использует индекс таблицы
Я использую интерфейс CRUDRepository для того, чтобы использовать метод save в другом классе, где вводится Repository.
Этот метод делает вставку и выбор для извлечения этого объекта, вставленного из базы данных, я имею в виду.
Выполненный запрос довольно прост:
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 (универсальный пул соединений). Моя конфигурация компонента базы данных следующая (переменные задаются файлом 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 ответ
@krokodilko Как вы и ожидали, ошибка была между типом базы данных и типом java. В DDBB это поле является строкой (varchar2(15)). В Java это поле отображается с длинным типом. Я предполагаю, что hibernate или база данных выполняет преобразование, которое нарушает индекс. Я изменил тип Java на тип String, и запрос работает успешно. Объясните план правильный.