#java #spring-boot #spring-data-jpa #spring-data #jdbctemplate
#java #spring-boot #spring-data-jpa #spring-данные #jdbctemplate
Вопрос:
Когда я извлекаю список данных из базы данных oracle на Java с помощью jdbctemplate.queryForList, он слишком медленный. Выполнение запроса к базе данных занимает 1,5 секунды. Чтобы получить его в java, требуется 20 секунд.
Мое приложение находится в java 8 spring boot 2.0.1, и я использую jdbctemplate.
Приведенный ниже код :
application.properties (подключение к свойствам базы данных)
toto.url=jdbc:oracle:thin:toto
toto.username=toto
toto.password=toto
driver-class-name=oracle.jdbc.OracleDriver
DataSourceConfig
package com.bnp.paribas.ism.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import javax.sql.DataSource;
@Configuration
public class DatabaseConfig {
@Autowired
private Environment environment;
@Autowired
private DataSourceProperties dataSourceProperties;
@Bean(name = "toto")
public DataSource getDataSource() {
SingleConnectionDataSource singleConnectionDataSource = new SingleConnectionDataSource();
singleConnectionDataSource.setDriverClassName(environment.getProperty("driver-class-name"));
singleConnectionDataSource.setUrl(environment.getProperty("toto.url"));
singleConnectionDataSource.setUsername(environment.getProperty("toto.username"));
singleConnectionDataSource.setPassword(environment.getProperty("toto.password"));
return singleConnectionDataSource;
}
@Bean(name = "totoJdbcTemplate")
@Autowired
public JdbcTemplate getJdbcTemplate(@Qualifier("toto") DataSource toto) {
return new JdbcTemplate(toto);
}
}
DAO
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.util.List;
@Repository
public class TotoDAO {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<String> getPckSpecificationContent(String schema, String namePck){
StringBuilder requete = new StringBuilder();
requete.append("SELECT TEXT ")
.append("FROM ALL_SOURCE ")
.append("WHERE OWNER='").append(schema).append("' ")
.append("AND TYPE='PACKAGE' ")
.append("AND NAME='").append(namePck).append("'");
return jdbcTemplate.queryForList(requete.toString(), String.class);
}
public List<String> getPckBodyContent(String schema, String namePck){
StringBuilder requete = new StringBuilder();
requete.append("SELECT TEXT ")
.append("FROM ALL_SOURCE ")
.append("WHERE OWNER=?" )
.append("AND TYPE=? " )
.append("AND NAME=?");
return jdbcTemplate.queryForList(requete.toString(), String.class, schema, "PACKAGE BODY", namePck);
}
public List<String> getListPckName(String schema){
StringBuilder requete = new StringBuilder();
requete.append("SELECT DISTINCT NAME ")
.append("FROM ALL_SOURCE ")
.append("WHERE OWNER='").append(schema).append("' ")
.append("AND TYPE='PACKAGE' ")
.append("ORDER BY NAME ASC");
return jdbcTemplate.queryForList(requete.toString(), String.class);
}
}
Тест кода
@Test
public void test4(){
long debut = System.nanoTime();
totoDAO.getPckBodyContent(Constant.SCHEMA_NAME, PCK_NAME);
logger.info("temps écoulé : {} ", Double.valueOf(TimeUnit.NANOSECONDS.toMillis(System.nanoTime()
- debut))/1000.0);
}
Выполнение этого запроса занимает 20 секунд.
Должен ли я использовать что-то другое, кроме querylist?
Что-то другое, кроме jdbctemplate?
Комментарии:
1. Запрос не занимает 20 секунд, сопоставление всех строк с объектами Java и получение данных занимает 18 секунд. Вы сравниваете яблоки и апельсины. Я бы также предложил использовать Spring Boot для предоставления источника данных и JdbcTemplate вместо того, чтобы настраивать свой собственный, и установить больший
fetchSize
(значение по умолчанию равно 10, что приводит к большому количеству обходов, если у вас много строк).2. установка размера выборки решает мою проблему. От 20 секунд до 2:). Действительно, я получаю более 4000 строк. Большое спасибо. Я возвращаюсь к предоставленной конфигурации spring boot, я изменил использование singledatasourceconnection, предложенное другим сообщением.