【问题标题】:Can Spring Boot JPA and JDBC share same DataSource/connections?Spring Boot JPA 和 JDBC 可以共享相同的数据源/连接吗?
【发布时间】:2018-07-13 02:00:09
【问题描述】:

这里是 Spring Boot。我目前对我的所有 JPA 实体都使用 JPA/Hibernate 和 CrudRepository 接口,到目前为止它对我来说效果很好。我需要执行一个需要UNION 的复杂查询,据我所知,Hibernate 不支持联合(或者至少不支持它们)。我通过在我的CrudRepository 中尝试了十几个 个不同的 JPQL 查询进行了验证,所有这些查询都失败了,因为 Hibernate(JPA 提供者)不喜欢 UNION

因此,我完全可以在这种情况下使用原始 JDBC 查询,并从结果 ResultSet 执行我自己的准或映射回到我的实体实例。

我关心的是管理 JDBC 连接。我在应用程序配置 (YAML) 文件中配置我的 JPA/Hibernate 连接配置:

spring:
  cache:
    type: none
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myapp_db?useSSL=false
    username: root
    testWhileIdle: true
    validationQuery: SELECT 1
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: none
      naming:
        physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
    properties:
      hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
      hibernate.cache.use_second_level_cache: false
      hibernate.cache.use_query_cache: false
      hibernate.generate_statistics: false
      hibernate.hbm2ddl.auto: validate
  • 我需要两个 DataSources,一个用于 JPA/Hibernate,另一个用于我的 JDBC(毕竟两者都连接到完全相同的数据库)
  • 维护这两个DataSource 实例是否会出现性能或网络/套接字问题? 我需要做的任何特别的事情
  • 目前我不相信我的 JPA/Hibernate 配置使用连接池,但理想情况下我想使用 HikariCP 来为 JPA/Hibernate 以及我的原始 JDBC 查询
  • 有没有办法让我的CrudRepository 实例(JPA/Hibernate)和我的原始 JDBC 连接使用完全相同的DataSource/config?如果是这样,这个配置/代码会是什么样子?

我知道这里有几个问题,但我相信正确的厌战 JDBC/JPA 资深人士将能够通过配置和/或代码的快速 sn-p 解决所有这些问题!提前致谢!

【问题讨论】:

  • 您也可以使用 JPA 执行 SQL 查询。 EntityManager.createNativeQuery。无需使用 JDBC。
  • 好的,谢谢@Simon....但是通过 JPA 会引出 Hibernate 作为提供者,而 Hibernate 不喜欢我的 UNION。
  • 不! Hibernate 将按原样执行 SQL 语句。
  • 啊,有趣。感谢@SimonMartinelli(所有 3 人 +1)。快速提问:我仔细阅读了this article,这让我看起来只需要访问entityManager 实例。然而,到目前为止,我已经使用CrudRepositories 将所有这些抽象出来。根据this answer,它听起来就像我可以使用@Autowired@PersistenceContext(unitName = "mytable") 注入我的代码?这在实践中会是什么样子?谢谢!

标签: hibernate jpa spring-boot jdbc datasource


【解决方案1】:

休眠/SQL

首先阅读文档如何使用 Hibernate 执行 SQL:

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#sql

例子:

List<Object[]> persons = entityManager.createNativeQuery("SELECT * FROM Person" ).getResultList();

HikariCP

如果你可以使用 Spring Boot 2,因为 HikariCP 是默认连接池。

否则请阅读这篇文章:

http://therealdanvega.com/blog/2017/07/26/use-hikaricp-next-spring-boot-project

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 2010-10-14
  • 2016-09-14
  • 2021-05-14
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多