繁体   English   中英

在Spring Boot Project中将HikariCP与Hibernate结合使用的更好方法

[英]Better way to use HikariCP with Hibernate in Spring Boot Project

我是一个初学者,我有一个简单的Spring Boot项目,这是我第一次使用连接池(在这种情况下为HikariCP),我需要您的帮助。 它正在工作,但是我想知道我是否在Hibernate中正确使用了它,或者是否有更好的方法来完成它,以及我的Spring Boot项目结构是否正确。

编辑:即使删除类HikariCPConfig ,它也能正常工作,我怎么知道连接池是否正常工作?

该项目如下:

- BankManager
   src/main/java
     |
     |__com.manager
        |__BankManagerApplication.java
        |__HikariCPConfig.java
     |__com.manager.dao
        |__ClientRepository.java
     |__com.manager.entities
        |__Client.java
     |__com.manager.service
        |__ClientServiceImpl.java
        |__ClientServiceInterface.java

   src/main/resources
     |__application.properties

BankManagerApplication.java:

@SpringBootApplication

    public class BankManagerApplication {

        public static void main(String[] args) {    
            ApplicationContext ctx = SpringApplication.run(BankManagerApplication.class, args);
            ClientServiceInterface service = ctx.getBean(ClientServiceInterface.class);
            service.addClient(new Client("client1"));
            service.addClient(new Client("client2"));
            }
    }

HikariCPConfig.java:

@Configuration
@ComponentScan
class HikariCPConfig {

   @Value("${spring.datasource.username}")
   private String user;

   @Value("${spring.datasource.password}")
   private String password;

   @Value("${spring.datasource.url}")
   private String dataSourceUrl;

   @Value("${spring.datasource.dataSourceClassName}")
   private String dataSourceClassName;

   @Value("${spring.datasource.poolName}")
   private String poolName;

   @Value("${spring.datasource.connectionTimeout}")
   private int connectionTimeout;

   @Value("${spring.datasource.maxLifetime}")
   private int maxLifetime;

   @Value("${spring.datasource.maximumPoolSize}")
   private int maximumPoolSize;

   @Value("${spring.datasource.minimumIdle}")
   private int minimumIdle;

   @Value("${spring.datasource.idleTimeout}")
   private int idleTimeout;

   @Bean
   public HikariDataSource primaryDataSource() {
       Properties dsProps = new Properties();
       dsProps.put("url", dataSourceUrl);
       dsProps.put("user", user);
       dsProps.put("password", password);
       dsProps.put("prepStmtCacheSize",250);
       dsProps.put("prepStmtCacheSqlLimit",2048);
       dsProps.put("cachePrepStmts",Boolean.TRUE);
       dsProps.put("useServerPrepStmts",Boolean.TRUE);

       Properties configProps = new Properties();
          configProps.put("dataSourceClassName", dataSourceClassName);
          configProps.put("poolName",poolName);
          configProps.put("maximumPoolSize",maximumPoolSize);
          configProps.put("minimumIdle",minimumIdle);
          configProps.put("minimumIdle",minimumIdle);
          configProps.put("connectionTimeout", connectionTimeout);
          configProps.put("idleTimeout", idleTimeout);
          configProps.put("dataSourceProperties", dsProps);

      HikariConfig hc = new HikariConfig(configProps);
      HikariDataSource ds = new HikariDataSource(hc);
      return ds;
   }
}

ClientServiceImpl.java

@Service
public class ClientServiceImpl implements ClientServiceInterface {

    @Autowired
    ClientRepository clientRepository; // this class extends JPARepository

    @Override
    public Client addClient(Client c) {
        return clientRepository.save(c);
    }
}

application.properties:

server.port = 8888
spring.jpa.databasePlatform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update

spring.datasource.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/bank_manager
spring.datasource.username=root
spring.datasource.password=
spring.datasource.poolName=SpringBootHikariCP
spring.datasource.maximumPoolSize=5
spring.datasource.minimumIdle=3
spring.datasource.maxLifetime=2000000
spring.datasource.connectionTimeout=30000
spring.datasource.idleTimeout=30000
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=250

先感谢您。

您的项目结构是标准的,因此是正确的。

关于光:

Hikari确实是汇集的绝佳选择。 我过去经常使用您在案例中应用的一小部分参数来与Hikari一起成功地工作,但是如果它对您有用,那就很好。 有关Hikaru设置的更多信息,我建议您阅读官方Wiki (如果尚未安装)。

关于属性加载:

您可以利用一些SpringBoot功能来读取数据库参数,并以较少的代码将其应用于运行时Bean。 喜欢:

在application.properties(为池参数定义自定义前缀“ myproject.db”)中, myproject.db.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource myproject.db.url=jdbc:mysql://localhost:3306/bank_manager myproject.db.username=root ... and the other params below

创建一个Spring Configuration类

@Configuration
public class MyDBConfiguration {

    @Bean(name = "myProjectDataSource")
    @ConfigurationProperties(prefix = "myproject.db")
    public DataSource dataSource(){
        //This will activate Hikari to create a new DataSource instance with all parameters you defined with 'myproject.db'
        return DataSourceBuilder.create().build();
    }
}

在您的ClientRepository类中:

@Repository
public class ClientRepository {

    //The code below is optional, but will work if you want to use jdbctemplate tied to the DataSource created above. By default all Hibernate Sessions will take the DataSource generated by Spring
    @Bean(name = "myProjectJdbcTemplate")
    public JdbcTemplate jdbcTemplate(@Qualifier("myProjectDataSource") DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }
}

如果要使用2个或更多不同的数据库,还有其他选项可以管理DataSource bean的创建。 您可以更改其他数据库的属性前缀,并仅将1个数据源注释为@Primary,这在Spring上下文中有多个数据源时是必需的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM