Quarkus应用能否连接多种不同数据库及实体持久化方法
Quarkus多异构数据库连接与实体持久化问题
问题背景
希望Quarkus应用同时连接PostgreSQL和MySQL数据库,已配置application.properties并添加对应JDBC依赖,但存在疑问:
- Quarkus是否支持连接多种不同类型的数据库?
- 若支持,如何将Entity持久化到对应的数据库?
已配置的application.properties
quarkus.datasource.postgresql.db-kind=postgresql quarkus.datasource.postgresql.username=xyz quarkus.datasource.postgresql.password=xyz quarkus.datasource.postgresql.jdbc.url=jdbc:postgresql://localhost:5432/xyz quarkus.datasource.mysql.db-kind=mysql quarkus.datasource.mysql.username=xyz quarkus.datasource.mysql.password=xyz quarkus.datasource.mysql.jdbc.url=jdbc:mysql://localhost:3305/xyz
已添加的pom依赖
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-mysql</artifactId> </dependency>
解答
1. Quarkus是否支持连接多种不同类型的数据库?
完全支持。Quarkus的多数据源机制允许同时连接异构数据库(如PostgreSQL、MySQL、Oracle等),你当前采用的命名式数据源配置(通过postgresql、mysql作为后缀区分数据源)是官方推荐的标准方式,只要对应JDBC依赖配置正确,就可以正常建立多个数据库连接。
2. 如何将Entity持久化到对应的数据库?
需要为每个数据源绑定独立的Hibernate ORM持久化单元(Persistence Unit),并将实体与对应单元关联,具体步骤如下:
步骤1:补充application.properties的ORM配置
为每个数据源指定对应的Hibernate ORM配置,包括方言、实体扫描包等:
# PostgreSQL对应的ORM配置 quarkus.hibernate-orm.postgresql.datasource=postgresql quarkus.hibernate-orm.postgresql.dialect=org.hibernate.dialect.PostgreSQLDialect quarkus.hibernate-orm.postgresql.packages=com.yourproject.entities.postgres # MySQL对应的ORM配置 quarkus.hibernate-orm.mysql.datasource=mysql quarkus.hibernate-orm.mysql.dialect=org.hibernate.dialect.MySQL8Dialect quarkus.hibernate-orm.mysql.packages=com.yourproject.entities.mysql
packages字段指定该持久化单元要扫描的实体类所在包,确保不同数据库的实体分属不同包。
步骤2:编写分属不同数据库的实体类
将PostgreSQL和MySQL的实体类分别放在上述配置的包路径下,例如:
// com.yourproject.entities.postgres包下的PostgreSQL实体 @Entity @Table(name = "postgres_table") public class PostgresEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String content; // getter、setter } // com.yourproject.entities.mysql包下的MySQL实体 @Entity @Table(name = "mysql_table") public class MySqlEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String data; // getter、setter }
步骤3:创建对应数据库的Repository
通过@PersistenceUnit指定使用的持久化单元,实现实体的持久化操作:
// PostgreSQL对应的Repository @ApplicationScoped public class PostgresEntityRepository { @PersistenceUnit(unitName = "postgresql") private EntityManager em; public void save(PostgresEntity entity) { em.persist(entity); } // 其他CRUD方法 } // MySQL对应的Repository @ApplicationScoped public class MySqlEntityRepository { @PersistenceUnit(unitName = "mysql") private EntityManager em; public void save(MySqlEntity entity) { em.persist(entity); } // 其他CRUD方法 }
(可选)使用Quarkus Panache简化操作
如果使用Quarkus Panache,可以通过指定持久化单元来关联对应数据源:
// PostgreSQL Panache实体 @Entity @Table(name = "postgres_table") public class PostgresEntity extends PanacheEntityBase { public String content; } // PostgreSQL Panache Repository @ApplicationScoped public class PostgresEntityRepository implements PanacheRepository<PostgresEntity> { @Override public EntityManager getEntityManager() { return EntityManagerProvider.getEntityManager("postgresql"); } }
内容的提问来源于stack exchange,提问作者nevzo
相关产品推荐
相关产品推荐

