spring jdbctemplate queryforlist слишком медленный, как это исправить?

#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, предложенное другим сообщением.