我有一个使用 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 倍。
我的数据库配置是这样的 导入 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;