Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC模板的工作速度很慢_Java_Jdbctemplate - Fatal编程技术网

Java JDBC模板的工作速度很慢

Java JDBC模板的工作速度很慢,java,jdbctemplate,Java,Jdbctemplate,使用JDBCTemplate从数据库中获取行时出现性能问题。当我在plsql中运行sql时,我可以在3毫秒内得到结果,但代码中的同一查询在200毫秒左右工作。我认为它工作得很慢,因为在运行查询之前,创建了一个连接,我在其中浪费了太多时间。我想我需要一个连接池或smt。否则 在这里编写代码之前,我想谈谈我的spring boot项目的流程。客户端调用我的端点,在这个调用中,我使用来自多个表的多个查询。所有查询都运行缓慢,因为对于每个查询,都会创建另一个连接 数据库配置类 RestControlle

使用JDBCTemplate从数据库中获取行时出现性能问题。当我在plsql中运行sql时,我可以在3毫秒内得到结果,但代码中的同一查询在200毫秒左右工作。我认为它工作得很慢,因为在运行查询之前,创建了一个连接,我在其中浪费了太多时间。我想我需要一个连接池或smt。否则

在这里编写代码之前,我想谈谈我的spring boot项目的流程。客户端调用我的端点,在这个调用中,我使用来自多个表的多个查询。所有查询都运行缓慢,因为对于每个查询,都会创建另一个连接

数据库配置类 RestController中的查询 此功能最多需要2秒钟

刀 达伊姆普 解决方案 更改DriverManager数据源

@Configuration
public class DatabaseConfig {

    @Autowired
    private Environment env;

    @Autowired
    private DataSourceProperties dataSourceProperties;

    @Bean(name = "fraudDb")
    public DataSource masterDataSource() {
        DataSourceBuilder factory = DataSourceBuilder
                .create(this.dataSourceProperties.getClassLoader())
                .driverClassName(env.getProperty("driver-class-name"))
                .url(env.getProperty("fraud.url"))
                .username(env.getProperty("fraud.username"))
                .password(env.getProperty("fraud.password"));
        return factory.build();
    }

    @Bean(name = "ndvliveDb")
    public DataSource secondDataSource() {
        DataSourceBuilder factory = DataSourceBuilder
                .create(this.dataSourceProperties.getClassLoader())
                .driverClassName(env.getProperty("driver-class-name"))
                .url(env.getProperty("ndvlive.url"))
                .username(env.getProperty("ndvlive.username"))
                .password(env.getProperty("ndvlive.password"));
        return factory.build();
    }

    @Bean(name = "fraudJdbcTemplate")
    @Autowired
    public JdbcTemplate masterJdbcTemplate(@Qualifier("fraudDb") DataSource fraudDb) {
        return new JdbcTemplate(fraudDb);
    }

    @Bean(name = "ndvliveJdbcTemplate")
    @Autowired
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("ndvliveDb") DataSource ndvliveDb) {
        return new JdbcTemplate(ndvliveDb);
    }
}

您可以做几件事来提高性能:

  • 不要使用
    drivermanagedatasource
    定义具有固定连接计数的连接池。要简化操作,请使用不会执行任何借用连接验证的
    SingleConnectionDataSource
    。这不是一个生产级设置,但在您的测试中将有较少的活动件
  • 选择*而不是
    ,只指定所需的列。JDBC和命令行客户机之间解析
    *
    可能不同,最好删除这个未知的代码
  • 将准备好的语句与
    client\u no=?
    一起使用,而不是将
    client\u no=“+clientNo
    连接起来。这将在检查不同的客户端编号时产生更好的查询计划缓存

  • 请注意,JVM需要10000多次方法调用才能开始JIT编译和优化
    如果不预热JVM,代码会变慢。命令行客户端已编译为本机代码。

    数据源和连接池。您能否解释HerediverManagerDataSource中的错误-因此没有连接池。每次创建和丢弃DB connection PreparedStatement时-而不是附加'clientNo''要查询,您可以使用PreparedStatement如果我使用除queryForObject之外的Prepared语句,我将获得更快的结果。我理解正确了吗?谢谢,现在我的查询很快:)正如您所说,我更改了所有查询。此外,我想我必须将DriverManager DataSoruce更改为DataSourceBuilder。+1此答案仅通过更改
    driverManager数据源
    SingleConnectionDataSource
    private RbtranServiceInputModel services(FraudActionsRestRequest fraudActionsRestRequest) {
    Long start = System.nanoTime();
            String debitSegmentId = ndvliveCustomerInfoService.getSBUCode(Integer.parseInt(cifNoSender));
            Long end = System.nanoTime();
            System.out.println("debitSegmentId " + (end - start) / 1e6);
    
            //10 ms - 20 ms
            start = System.nanoTime();
            String debitName = ndvliveCustomerInfoService.getNameSurname(new BigDecimal(cifNoSender), userId);
            end = System.nanoTime();
            System.out.println("debitName " + (end - start) / 1e6);
    
            //3 ms
            start = System.nanoTime();
            ResponseGetBMSInfo bmsInfo = ndvliveCustomerInfoService.getOnlineCustomerInfo(new BigDecimal(cifNoSender));
            end = System.nanoTime();
            System.out.println("bmsInfo " + (end - start) / 1e6);
    
            //10 MS
            start = System.nanoTime();
            Date passwordChangeDate = ndvliveCustomerInfoService.getPasswordChangeDate(new BigDecimal(cifNoSender), userId);
            end = System.nanoTime();
            System.out.println("passwordChangeDate " + (end - start) / 1e6);
    
            //10ms
            start = System.nanoTime();
            Date smartSmsGsmNoRegistrationDate = ndvliveCustomerInfoService.getSmartSmsGsmNoRegistrationDate(new BigDecimal(cifNoSender), userId);
            end = System.nanoTime();
            System.out.println("smartSmsGsmNoRegistrationDate " + (end - start) / 1e6);
    
            //6 ms
            start = System.nanoTime();
            Date membershipDate = ndvliveCustomerInfoService.getMembershipDate(new BigDecimal(cifNoSender), userId);
            end = System.nanoTime();
            System.out.println("membershipDate " + (end - start) / 1e6);
    
            start = System.nanoTime();
            BigDecimal smartSmsNo = ndvliveCustomerInfoService.getSmsGsmNo(new BigDecimal(cifNoSender));//TODO sms;
            end = System.nanoTime();
            System.out.println("smartSmsNo " + (end - start) / 1e6);
    
            start = System.nanoTime();
            String habitInfo = ndvliveCustomerInfoService.getHabitInfo(new BigDecimal(cifNoSender), channel);
            end = System.nanoTime();
            System.out.println("habitInfo " + (end - start) / 1e6);
    
            start = System.nanoTime();
            Date lastBlockSimDate = ndvliveCustomerInfoService.getLastBlockSimDate(new BigDecimal(cifNoSender), userId);
            end = System.nanoTime();
            System.out.println("lastBlockSimDate " + (end - start) / 1e6);
    
            start = System.nanoTime();
            boolean isFamiliar = ndvliveCustomerAccountInfoService.getFamiliarAccount(new BigDecimal(fraudActionsRestRequest.getDebitCustomerId()), fraudActionsRestRequest.getProcessCode(), fraudActionsRestRequest.getCreditAcctNumber(), fraudActionsRestRequest.getSmartSmsNo());
            end = System.nanoTime();
            System.out.println("isFamiliar " + (end - start) / 1e6);
            rbtranServiceInputModel.setKnownAccount(isFamiliar);
    
            start = System.nanoTime();
            boolean isInWhitelist = ndvliveDeviceInfoService.isInWhiteList(Long.parseLong(fraudActionsRestRequest.getDebitCustomerId()), fraudActionsRestRequest.getUserData02(), fraudActionsRestRequest.getDeviceId());
            end = System.nanoTime();
            System.out.println("isInWhitelist " + (end - start) / 1e6);
            rbtranServiceInputModel.setInWhitelist(isInWhitelist);
        }
    
    public interface CustomerInformationTempDao {
        String getSbuCodeByClientNo(Integer clientNo);
    }
    
    @Repository
    public class CustomerInformationTempDaoImpl implements CustomerInformationTempDao {
    
        @Autowired
        @Qualifier("ndvliveJdbcTemplate")
        private JdbcTemplate ndvliveJdbcTemplate;
    
        public String getSbuCodeByClientNo(Integer clientNo) {
            String query = "SELECT * FROM mytable WHERE client_no=" + clientNo;
            try {
                return ndvliveJdbcTemplate.queryForObject(query, (resultSet, i) -> resultSet.getString("SBU_CODE"));
            } catch (EmptyResultDataAccessException e) {
                return null;
            }
        }
    }
    
    @Configuration
    public class DatabaseConfig {
    
        @Autowired
        private Environment env;
    
        @Autowired
        private DataSourceProperties dataSourceProperties;
    
        @Bean(name = "fraudDb")
        public DataSource masterDataSource() {
            DataSourceBuilder factory = DataSourceBuilder
                    .create(this.dataSourceProperties.getClassLoader())
                    .driverClassName(env.getProperty("driver-class-name"))
                    .url(env.getProperty("fraud.url"))
                    .username(env.getProperty("fraud.username"))
                    .password(env.getProperty("fraud.password"));
            return factory.build();
        }
    
        @Bean(name = "ndvliveDb")
        public DataSource secondDataSource() {
            DataSourceBuilder factory = DataSourceBuilder
                    .create(this.dataSourceProperties.getClassLoader())
                    .driverClassName(env.getProperty("driver-class-name"))
                    .url(env.getProperty("ndvlive.url"))
                    .username(env.getProperty("ndvlive.username"))
                    .password(env.getProperty("ndvlive.password"));
            return factory.build();
        }
    
        @Bean(name = "fraudJdbcTemplate")
        @Autowired
        public JdbcTemplate masterJdbcTemplate(@Qualifier("fraudDb") DataSource fraudDb) {
            return new JdbcTemplate(fraudDb);
        }
    
        @Bean(name = "ndvliveJdbcTemplate")
        @Autowired
        public JdbcTemplate secondaryJdbcTemplate(@Qualifier("ndvliveDb") DataSource ndvliveDb) {
            return new JdbcTemplate(ndvliveDb);
        }
    }