当前位置:   article > 正文

如何使用Spring JPA和Hikari CP连接SQL数据库_spring data jpa 连接池

spring data jpa 连接池

Spring Data JPA是 Spring Data Family中最常见和最成熟的框架。

微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩

首先,让我们在深入讨论之前设定议程。在这篇文章中,我们将只讨论如何使用 Spring Data JPA 框架使用 Hikari CP 作为连接池层进行多数据库连接。所以读者应该对 Spring Boot 、 Spring Data JPA 和连接池有基本的了解。

众所周知,Spring Data JPA 是 Spring Data Family 中最常见和最成熟的框架,它将在我们的应用程序 DAO 层中发挥作用。

我们需要做的就是在我们的 pom 中添加依赖项,并在应用程序属性文件中配置我们的数据库连接详细信息。所有其他事情都将由 Spring Boot 的自动配置魔法来处理,这意味着无需编写任何单个 Java 代码来配置数据源。

在高层次上,Spring 自动配置将使用我们在属性文件中提供的连接详细信息为数据源、实体管理器和事务创建 bean。

数据源:形成连接对象,包含数据库连接详细信息

EntityManager :它与数据源具有一对一的关系,管理 JPA 实体及其持久化操作。

事务管理器:它与实体管理器具有一对一的关系。它处理事务。

之所以讨论这个 JPA 内部,是为了让您知道 JPA 需要这三个 bean 来连接数据库并执行操作。

因此,对于每个数据库连接,您都需要创建这些 bean。考虑一下,如果您的应用程序想要连接 2 个不同的数据库,那么您需要为每个数据库创建这些 bean。这意味着我们在配置阶段创建了多个相同类型的 bean。因此,我们需要用“@Primary”注释其中一个 bean。

所以在这里,我将展示一个 Spring JPA 多数据库配置的示例,在我的示例中,将使用 2 个数据库。只是为了解释起见,假设一个数据库是 Oracle(主),另一个是 My SQL。

主要数据源配置:

这里要注意的一件事是,您必须将 JPA 存储库和实体包链接到 entityManager。

“@EnableJpaRepositories”有一个属性“basePackages”。您必须提及此数据库的存储库文件包名称作为此属性的值。如果您有多个要扫描的包,请用逗号分隔。

“LocalContainerEntityManagerFactoryBean”有一个属性“packageToScan”。您必须在此属性中提及相应的 JPA 实体文件包名称。如果要扫描多个包,则将其传递到字符串数组中。

  1. @Configuration
  2. @EnableConfigurationProperties({PrimaryDataSourceProperties.class})
  3. @EnableTransactionManagement
  4. @EnableJpaRepositories(
  5.         entityManagerFactoryRef="entityManagerFactory",
  6.         basePackages={"com.primary.repo"}
  7. )
  8. public class PrimaryDataSource {
  9.     @Autowired
  10.     PrimaryDataSourceProperties dataSourceProp;
  11.     @Primary
  12.     @Bean(name="dataSource")
  13.     public DataSource primaryDataSource(){
  14.         HikariConfig hikariConfig = new HikariConfig();
  15.         hikariConfig.setUserName(dataSourceProp.getUsername());
  16.         hikariConfig.setPassword(dataSourceProp.getPassword());
  17.         hikariConfig.setJdbcUrl(dataSourceProp.getUrl());
  18.         hikariConfig.setDriverClassName(dataSourceProp.getDriverClassName());
  19.         hikariConfig.setMaximumPoolSize(dataSourceProp.getMaxPoolSize());
  20.         hikariConfig.setMinimumIdle(dataSourceProp.getMinimumIdle());
  21.         hikariConfig.setConnectionTimeout(dataSourceProp.getConnectionTimeOut());
  22.         hikariConfig.setIdleTimeout(dataSourceProp.getIdleTimeOut());
  23.         hikariConfig.setPoolName(dataSourceProp.getPoolName());
  24.         return new HikariDataSource(hikariConfig);
  25.     }
  26.     @Primary
  27.     @Bean(name="entityManagerFactory")
  28.     public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
  29.                                                                        @Qualifier("dataSource") DataSource datasource){
  30.         LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
  31.         em.setDataSource(datasource);
  32.         em.setPackageToScan(new String[]{"com.primary.entity"});
  33.         HibernateJpaVendorAdaptor vendorAdaptor = new HibernateJpaVendorAdaptor();
  34.         em.setJpaVendorAdaptor(vendorAdaptor);
  35.         HashMap<StringObject> properties = new HashMap<>();
  36.         properties.put("hibernate.dialect""org.hibernate.dialect.OracleDialect");
  37.         em.setJpaPropertyMap(properties);
  38.         return em;
  39.     }
  40.     @Primary
  41.     @Bean(name="transactionManager")
  42.     public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory){
  43.         return new JpaTransactionManager(entityManagerFactory);
  44.     }
  45. }
  1. @ConfigurationProperties(prefix="primary.datasource")
  2. public class PrimaryDataSourceProperties{
  3.     private String url;
  4.     private String username;
  5.     private String password;
  6.     private String driverClassName;
  7.     private int connectionTimeOut;
  8.     private int idleTimeOut;
  9.     private int maxPoolSize;
  10.     private int minimumIdle;
  11.     private String poolName;
  12.     //Getters & Setters
  13. }

辅助数据源配置:

  1. @Configuration
  2. @EnableConfigurationProperties({SecondaryDataSourceProperties.class})
  3. @EnableTransactionManagement
  4. @EnableJpaRepositories(
  5.         entityManagerFactoryRef="secondaryEntityManagerFactory",
  6.         basePackages={"com.secondary.repo"}
  7. )
  8. public class PrimaryDataSource {
  9.     @Autowired
  10.     PrimaryDataSourceProperties dataSourceProp;
  11.     @Primary
  12.     @Bean(name="secondaryDataSource")
  13.     public DataSource primaryDataSource(){
  14.         HikariConfig hikariConfig = new HikariConfig();
  15.         hikariConfig.setUserName(dataSourceProp.getUsername());
  16.         hikariConfig.setPassword(dataSourceProp.getPassword());
  17.         hikariConfig.setJdbcUrl(dataSourceProp.getUrl());
  18.         hikariConfig.setDriverClassName(dataSourceProp.getDriverClassName());
  19.         hikariConfig.setMaximumPoolSize(dataSourceProp.getMaxPoolSize());
  20.         hikariConfig.setMinimumIdle(dataSourceProp.getMinimumIdle());
  21.         hikariConfig.setConnectionTimeout(dataSourceProp.getConnectionTimeOut());
  22.         hikariConfig.setIdleTimeout(dataSourceProp.getIdleTimeOut());
  23.         hikariConfig.setPoolName(dataSourceProp.getPoolName());
  24.         return new HikariDataSource(hikariConfig);
  25.     }
  26.     @Primary
  27.     @Bean(name="secondaryEntityManagerFactory")
  28.     public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
  29.                                                                        @Qualifier("secondaryDataSource") DataSource datasource){
  30.         LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
  31.         em.setDataSource(datasource);
  32.         em.setPackageToScan(new String[]{"com.secondary.entity"});
  33.         HibernateJpaVendorAdaptor vendorAdaptor = new HibernateJpaVendorAdaptor();
  34.         em.setJpaVendorAdaptor(vendorAdaptor);
  35.         HashMap<StringObject> properties = new HashMap<>();
  36.         properties.put("hibernate.dialect""org.hibernate.dialect.MySQLDialect");
  37.         em.setJpaPropertyMap(properties);
  38.         return em;
  39.     }
  40.     @Primary
  41.     @Bean(name="secondaryTransactionManager")
  42.     public PlatformTransactionManager transactionManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory){
  43.         return new JpaTransactionManager(entityManagerFactory);
  44.     }
  45. }
  1. @ConfigurationProperties(prefix="secondary.datasource")
  2. public class SecondaryDataSourceProperties{
  3.     private String url;
  4.     private String username;
  5.     private String password;
  6.     private String driverClassName;
  7.     private int connectionTimeOut;
  8.     private int idleTimeOut;
  9.     private int maxPoolSize;
  10.     private int minimumIdle;
  11.     private String poolName;
  12.     //Getters & Setters
  13. }
  1. primary.datasource.username=test
  2. primary.datasource.password=test
  3. primary.datasource.url=jdbc:oracle:thin:@test:8899/test
  4. primary.datasource.connectionTimeOut=60000
  5. primary.datasource.idleTimeOut=900000
  6. primary.datasource.maxPoolSize=10
  7. primary.datasource.minimumIdle=10
  8. secondary.datasource.username=test
  9. secondary.datasource.password=test
  10. secondary.datasource.url=jdbc:mysql:thin:@test:8899/test
  11. secondary.datasource.connectionTimeOut=60000
  12. secondary.datasource.idleTimeOut=900000
  13. secondary.datasource.maxPoolSize=10
  14. secondary.datasource.minimumIdle=10

推荐书单

《项目驱动零起点学Java》

《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。

《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。

马士兵,马士兵教育创始人,毕业于清华大学,著名IT讲师,所讲课程广受欢迎,学生遍布全球大厂,擅长用简单的语言讲授复杂的问题,擅长项目驱动知识的综合学习。马士兵教育获得在线教育“名课堂”奖、“最受欢迎机构”奖。

赵珊珊,从事多年一线开发,曾为国税、地税税务系统工作。拥有7年一线教学经验,多年线上、线下教育的积累沉淀,培养学员数万名,讲解细致,脉络清晰。

购买链接:https://u.jd.com/XwJWF2r

精彩回顾

想要代码干净又整洁?这里有十大原则

通过自学成为开发者的 9 种方法

怎么做一个有产品意识的软件工程师?

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/160624
推荐阅读
相关标签
  

闽ICP备14008679号