You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:06:11