Spring boot 对于 postgres 9.6 运行太慢

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

我有一个使用 java 8 和 postgres 9.6 的 apache ninja 项目。我只需要将其迁移到 Spring Boot。我正在使用 Spring Boot 2.5.x。但是当我配置这个项目时,它的运行速度比 apache ninja 慢 10 倍。我发现 jdbc 连接花费太多时间来获取和执行。 在我的 apache 项目中我正在使用

<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>

我无法在 Spring Boot 中使用相同的功能。

下面是我的 spring boot 的 pom.xml


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.12</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>

请帮助我如何修复它,以便它的执行速度至少与 apache ninja 一样快 10 倍。

spring spring-boot java-8 hikaricp postgres-9.6
1个回答
0
投票

我的数据库配置是这样的 导入 java.util.Properties;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.zaxxer.hikari.HikariDataSource;

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@EnableJpaRepositories(basePackages = {"repository.web"}, entityManagerFactoryRef="webEntityManagerFactory", transactionManagerRef="webTransactionManager")
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
public class WebDBConfig {

    @Autowired(required=true)
    public Environment environment;
    
    @Bean(name = "webDataSource")
    public HikariDataSource webDataSource() {
        HikariDataSource dataSource = new HikariDataSource();

        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setJdbcUrl(environment.getProperty("web.datasource.url"));
        dataSource.setUsername(environment.getProperty("web.datasource.username"));
        dataSource.setPassword(environment.getProperty("web.datasource.password"));

        dataSource.setMaximumPoolSize(10);
        dataSource.setIdleTimeout(30000);
        dataSource.setPoolName("Web-CP");
        dataSource.setConnectionTestQuery("SELECT 1");
        
        return dataSource;
    }

    @Bean(name = "webEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean webEntityManagerFactory() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        //vendorAdapter.setGenerateDdl(false);
        vendorAdapter.setDatabase(Database.POSTGRESQL);
        //vendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
        
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(webDataSource());
        em.setPackagesToScan("entity.web");
        em.setPersistenceUnitName("web");
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(hibernateProperties());

        return em;
    }
    
    @Primary    
    @Bean(name = "webTransactionManager")
    public PlatformTransactionManager webTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(webEntityManagerFactory().getObject());
        return transactionManager;
    }

    Properties hibernateProperties() {
        return new Properties() {
            {
                setProperty("hibernate.hbm2ddl.auto", "none");
                setProperty("hibernate.show_sql", "false");
                setProperty("hibernate.enable_lazy_load_no_trans", "true");
                setProperty("hibernate.generate_statistics", "false");
                setProperty("hibernate.format_sql", "false");
                setProperty("hibernate.temp.use_jdbc_metadata_default" ,"false");
                
            }
        };
    }
}

也在我的服务方法中我使用 org.springframework.transaction.annotation.Transactional;和

@PersistenceContext(unitName="web")
    private EntityManager entityManager;
© www.soinside.com 2019 - 2024. All rights reserved.