Spring Boot JPA 和 JDBC 可以共享相同的 DataSource/connections 吗?
Can Spring Boot JPA and JDBC share same DataSource/connections?
Spring 在这里开机。我目前对所有 JPA 实体使用 JPA/Hibernate 和 CrudRepository
接口,到目前为止它对我来说效果很好。我需要执行一个需要 UNION
的复杂查询,据我所知,Hibernate 不支持联合(或者至少不支持联合)。我已经通过在我的 CrudRepository
中尝试 dozen 个不同的 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
- 我是否需要两个
DataSource
,一个用于 JPA/Hibernate,另一个用于我的 JDBC(毕竟两者都连接到完全相同的数据库)
- 维护这两个
DataSource
实例是否会出现性能或 network/socket 问题?
我需要做的任何特别事情
- 目前我不相信我的JPA/Hibernate配置使用连接池,但理想情况下我想使用HikariCP进行池化对于 JPA/Hibernate 以及我的原始 JDBC 查询
- 有没有办法让我的
CrudRepository
实例 (JPA/Hibernate) 和我的原始 JDBC 连接使用完全相同的 DataSource
/config?如果是这样,这个 config/code 会是什么样子?
我知道这里有几个问题,但我相信厌倦战斗的 JDBC/JPA 老手将能够通过快速配置 and/or 代码片段解决所有问题!提前致谢!
Hibernate/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
Spring 在这里开机。我目前对所有 JPA 实体使用 JPA/Hibernate 和 CrudRepository
接口,到目前为止它对我来说效果很好。我需要执行一个需要 UNION
的复杂查询,据我所知,Hibernate 不支持联合(或者至少不支持联合)。我已经通过在我的 CrudRepository
中尝试 dozen 个不同的 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
- 我是否需要两个
DataSource
,一个用于 JPA/Hibernate,另一个用于我的 JDBC(毕竟两者都连接到完全相同的数据库) - 维护这两个
DataSource
实例是否会出现性能或 network/socket 问题? 我需要做的任何特别事情 - 目前我不相信我的JPA/Hibernate配置使用连接池,但理想情况下我想使用HikariCP进行池化对于 JPA/Hibernate 以及我的原始 JDBC 查询
- 有没有办法让我的
CrudRepository
实例 (JPA/Hibernate) 和我的原始 JDBC 连接使用完全相同的DataSource
/config?如果是这样,这个 config/code 会是什么样子?
我知道这里有几个问题,但我相信厌倦战斗的 JDBC/JPA 老手将能够通过快速配置 and/or 代码片段解决所有问题!提前致谢!
Hibernate/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