Quarkus @DataSource注解未正常工作问题求助
多数据源配置问题:Quarkus + Apache Camel 无法连接db03数据库
我们用Apache Camel和Quarkus开发项目,新增了MSSQL数据库db03,部分表已迁移至此。为实现db03的查询,我们通过@DataSource注解完成了配置与代码调整,但代码始终无法正确获取db03的数据库连接,求解决。
application.properties 配置
#Quarkus DB quarkus.datasource.jdbc.max-size=100 quarkus.datasource.db-kind=mssql quarkus.datasource.jdbc.url=jdbc:sqlserver://localhost:1433;database=db01;encrypt=true;trustServerCertificate=true;username=abc;password=xyz #Quarkus DB03 quarkus.datasource.db03.jdbc.max-size=100 quarkus.datasource.db03.db-kind=mssql quarkus.datasource.db03.jdbc.url=jdbc:sqlserver://localhost:1433;database=db03;encrypt=true;trustServerCertificate=true;username=abc;password=xyz quarkus.hibernate-orm.db03.database=db03
GetDataFromQuoteAudit.java 代码
@ApplicationScoped public class GetDataFromQuoteAudit implements Processor { private final QuoteAuditRepository quoteAuditRepository; @Inject public GetDataFromQuoteAudit(@DataSource("db03") QuoteAuditRepository quoteAuditRepository) { this.quoteAuditRepository = quoteAuditRepository; } @Override public void process(Exchange exchange) throws Exception { String quoteId = (String) exchange.getIn().getHeader("quoteId"); try { QuoteAudit quoteAudit = quoteAuditRepository.findById(Integer.parseInt(quoteId)); } catch (Exception e) { throw new InvalidQuoteIdException("Id does not exists"); } } }
QuoteAuditRepository.java 代码
@ApplicationScoped @DataSource("db03") public class QuoteAuditRepository implements PanacheRepository<QuoteAudit> { public QuoteAuditRepository() { } public QuoteAudit findById(int quoteId, long versionId, int itemId) { return (QuoteAudit)this.find("quoteId = ?1 and versionId = ?2 and itemId = ?3", new Object[]{quoteId, versionId, itemId}).firstResult(); } public QuoteAudit findById(int quoteId) { return (QuoteAudit)this.find("quoteId = ?1", new Object[]{quoteId}).firstResult(); } public void update(QuoteAudit quoteAudit) { this.getEntityManager().merge(quoteAudit); } }
问题排查与修复方案
1. 补充Hibernate ORM多数据源核心配置
当前配置缺少db03对应的Hibernate ORM关键配置,需添加:
# 绑定db03的实体类扫描包(替换为你项目中QuoteAudit实体所在的包) quarkus.hibernate-orm.db03.packages=com.yourproject.entity # 指定SQL Server方言 quarkus.hibernate-orm.db03.dialect=org.hibernate.dialect.SQLServerDialect # 可选:开启SQL日志用于调试 quarkus.hibernate-orm.db03.log.sql=true
2. 修正Repository的数据源绑定方式
Panache Repository仅用@DataSource注解无法正确关联持久化单元,需替换为@PersistenceUnit指定对应数据源:
@ApplicationScoped @PersistenceUnit("db03") // 绑定到配置中定义的db03持久化单元 public class QuoteAuditRepository implements PanacheRepository<QuoteAudit> { // 原有方法保留 }
3. 移除注入时冗余的@DataSource注解
因为QuoteAuditRepository已绑定db03数据源,注入时无需重复添加@DataSource,避免依赖注入冲突:
@Inject public GetDataFromQuoteAudit(QuoteAuditRepository quoteAuditRepository) { this.quoteAuditRepository = quoteAuditRepository; }
4. 验证数据源可用性(可选)
添加测试类确认db03数据源能正常连接:
@QuarkusTest public class Db03ConnectionTest { @Inject @DataSource("db03") DataSource db03DataSource; @Test public void testConnectionValidity() throws SQLException { try (Connection conn = db03DataSource.getConnection()) { assert conn.isValid(2); } } }
内容的提问来源于stack exchange,提问作者user5489618
相关产品推荐
相关产品推荐

