【问题标题】:Spring Boot and Spring-starter-data-jpa : Lazy loading of datasource setupSpring Boot 和 Spring-starter-data-jpa :延迟加载数据源设置
【发布时间】:2026-02-03 05:20:11
【问题描述】:

我正在开发一个带有 Spring-starter-data-jpa 和多数据源的应用程序,需要延迟初始化数据源连接,但我无法使用它。

例如,如果我在数据源配置上输入了错误的密码,应用程序启动将失败。

我尝试在 Datasource @Configuration 类上添加 @Lazy 注释,但应用程序在启动时仍然崩溃。

我尝试实现一个 LazyConnectionDataSourceProxy 而不是数据源,但没有成功。

我无法想象这是不可能的。

有人知道如何在第一个 jpa 存储库调用中延迟加载数据源配置吗?

我尝试使用这样的适配器/单例混合模式来做到这一点:

@Component
public class TestErrorDatasource implements DataSource {

private DataSource datasource;

@Autowired Environment env;

@Override
public PrintWriter getLogWriter() throws SQLException {
    return getDatasource().getLogWriter();
}

@Override
public int getLoginTimeout() throws SQLException {
    return getDatasource().getLoginTimeout();
}

@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
    return getDatasource().getParentLogger();
}

@Override
public void setLogWriter(PrintWriter arg0) throws SQLException {
    getDatasource().setLogWriter(arg0);
}

@Override
public void setLoginTimeout(int arg0) throws SQLException {
    getDatasource().setLoginTimeout(arg0);
}

@Override
public boolean isWrapperFor(Class<?> arg0) throws SQLException {
    return getDatasource().isWrapperFor(arg0);
}

@Override
public <T> T unwrap(Class<T> arg0) throws SQLException {
    return getDatasource().unwrap(arg0);
}

@Override
public Connection getConnection() throws SQLException {
    return getDatasource().getConnection();
}

@Override
public Connection getConnection(String arg0, String arg1) throws SQLException {
    return getDatasource().getConnection(arg0, arg1);
}

private DataSource getDatasource() {
    if(datasource == null) {
        this.datasource = DataSourceBuilder
                .create()
                .driverClassName(env.getProperty("testError.datasource.driverClassName"))
                .url(env.getProperty("testError.datasource.url"))
                .username(env.getProperty("testError.datasource.username"))
                .password(env.getProperty("testError.datasource.password"))
                .build();
    }
    return datasource;
}

}

但它不起作用。

我在 getConnection() 方法上设置了一个断点,并提出它在启动时被调用

org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl

是否有任何配置可以避免休眠检查启动时的 getConnection() 方法?

提前致谢

【问题讨论】:

    标签: spring hibernate spring-boot spring-data-jpa lazy-initialization


    【解决方案1】:

    数据源只是一个带有“getConnection()”方法的接口。

    因此,创建您自己的实现,该实现委托给仅在首次调用 getConnection 时创建的单例。

    换句话说,虽然您的实现可以是 Spring bean,但它的单例依赖不是,也没有注入,而是在您第一次访问 getConnection 时设置。

    【讨论】:

    • PaulNUK 它似乎不起作用,我编辑了我的问题