使用JDBC查询运行要慢得多

问题描述 投票:0回答:1

我有两个不同的查询,在与Adminer或Dbeaver一起计时时,它们执行相同的时间

查询一个

select * from state where state_name = 'Florida';

[当我在Adminer中运行上面的查询时,它需要的位置为

0.032 s至0.058 s

查询二

select
    property.id as property_id ,
    full_address,
    street_address,
    street.street,
    city.city as city,
    state.state_code as state_code,
    zipcode.zipcode as zipcode
from
    property
inner join street on
    street.id = property.street_id
inner join city on
    city.id = property.city_id
inner join state on
    state.id = property.state_id
inner join zipcode on
    zipcode.id = property.zipcode_id
where
    full_address = '139-Skillman-Ave-Apt-5C-Brooklyn-NY-11211';

以上查询取自

0.025 s至0.048 s

我有以下使用JDBCTemplate执行相同查询的方法。

查询一个

public void performanceTest(String str) {
    template.queryForObject(
            "select * from state where state_name = ?",
            new Object[] { str }, (result, rowNum) -> {
                return result.getObject("state_name");
            });

}

时间:140ms,即0.14秒

查询二

public void performanceTest(String str) {
    template.queryForObject(
            "SELECT property.id AS property_id , full_address, street_address, street.street, city.city as city, state.state_code as state_code, zipcode.zipcode as zipcode FROM property INNER JOIN street ON street.id = property.street_id INNER JOIN city ON city.id = property.city_id INNER JOIN state ON state.id = property.state_id INNER JOIN zipcode ON zipcode.id = property.zipcode_id WHERE full_address = ?",
            new Object[] { str }, (result, rowNum) -> {
                return result.getObject("property_id");
            });

}

执行上述方法所需的时间是

时间:828毫秒,即0.825秒

我正在使用下面的这段代码计时方法的执行时间

long startTime1 = System.nanoTime();
propertyRepo.performanceTest(address); //or "Florida" depending which query I'm testing
long endTime1 = System.nanoTime();
long duration1 = TimeUnit.MILLISECONDS.convert((endTime1 - startTime1), TimeUnit.NANOSECONDS);
System.out.println("time: " + duration1);

为什么从JDBC运行查询时比从Adminer运行查询时查询两个要慢得多?我可以采取什么措施来提高查询两个的性能?

spring spring-boot jdbc jdbctemplate
1个回答
0
投票

这是因为不同的客户端使用了连接池。您可以像这样为JDBC建立像HikariC这样的快速连接池:

public class HikariCPDataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        config.setJdbcUrl("jdbc:h2:mem:test");
        config.setUsername("user");
        config.setPassword("password");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    private HikariCPDataSource(){}
}
© www.soinside.com 2019 - 2024. All rights reserved.