SpringJDBCTemplateQueryForList太慢,如何修复?

pu3pd22g  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(390)

当我通过jdbctemplate.queryforlist从java中的oracle数据库检索数据列表时,速度太慢了。在数据库上执行查询需要1.5秒。在java中检索它需要20秒。
我的应用程序是Java8SpringBoot2.0.1,我使用jdbctemplate。
代码如下:

application.properties(数据库属性连接)

toto.url=jdbc:oracle:thin:toto
toto.username=toto
toto.password=toto
driver-class-name=oracle.jdbc.OracleDriver

数据源配置

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);
    }

}

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之外的东西?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题