Spring.datasource.initialize=false 不工作

Posted

技术标签:

【中文标题】Spring.datasource.initialize=false 不工作【英文标题】:Spring.datasource.initialize=false not working 【发布时间】:2016-10-04 05:54:46 【问题描述】:

我正在开发 Spring Boot 和批处理应用程序。 由于批处理,应用程序尝试连接到数据源 与spring-boot:run。 我想阻止它并尝试了spring.datasource.initialize=false

同时也放上spring.batch.job.enabled=false

虽然第二个工作正常,但似乎第一个被忽略了。

有人可以告诉我是否有办法在启动时停止数据库连接? 提前致谢

【问题讨论】:

也试过 spring.batch.initialize.enabled=false 你不能。 DataSource 一被引用就会被创建。 initialize 属性只会停止表的创建,而不是 DataSource 本身的开始。 【参考方案1】:

据我了解,您不想在应用程序启动期间阻止数据库连接。

相反,您想阻止批处理脚本的执行。

如果我错了,请纠正我。

为了防止执行批处理脚本集:

spring.batch.initializer.enabled=false

【讨论】:

我想把两个都扔掉。虽然我能够停止批量初始化,但我无法停止数据库初始化。我希望仅在实际需要时调用数据库,而不是在加载初始静态索引页面时调用。【参考方案2】:

问题是,spring/spring-boot 在“启动”时会加载整个 spring-context。这意味着,在这个引导阶段,所有定义的 spring-beans 都被加载到 spring-context 中。在 spring-batch 的情况下,这也意味着数据源 bean 被加载,如果没有被 "spring.batch.initializer.enabled=false" 关闭,spring-batch 表被初始化。

通常,一旦将 spring-batch-starter 添加到 maven 依赖项中,就无法阻止这种情况发生。

此外,我不明白您为什么要阻止这种情况发生。这只是初始化,只要一切配置正确,这根本不成问题。

不过,如果您真的想阻止数据源初始化,您可以尝试以下方法。但是,我不知道这是否可行。

Spring-Batch 需要一个在 spring-context 中以名称“dataSource”注册的数据源。如果没有找到具有该名称的 spring-bean,它将创建自己的。但是,如果您为其提供自己的实现/配置,它将使用您的 spring bean。

您需要做的是,为延迟加载的数据源提供代理,然后在上下文中将其注册为名称“dataSource”:

@Configuration
public class MySetUp 

    @Bean
    public DataSource dataSource() 
        // ... create your "lazy initializing" datasource 
    

但是 - 让我强调一下 - 这不是我推荐的,而且我认为没有充分的理由,为什么有必要这样做。

此外,您提到您只想加载“初始静态索引页面”(我假设您在谈论 html,对吗?)。但是,我没有看到应该显示 html 页面的“批处理”用例。在这种情况下,最好有两个不同的应用程序。

或许您可以提供更多关于您的用例的信息。

【讨论】:

我正在使用 Spring Boot 控制器并调用可以独立于 POJO 的通用批处理作业。我快到了,但还没有。开始面临数据库初始化的问题。我试图阻止它,但真的搞砸了。我的应用程序正在加载任何文件而没有 POJo 读取 thr' itemreader 并传递给 writer 以写入 db。但那里的一切都搞砸了。现在我的应用程序无法读取应用程序。属性文件虽然它在类路径中。虽然使用相同的工作区和配置,其他应用程序正在使用道具,但任何以批处理开始的东西都不是。 我将在几个小时后分享我的代码。它现在正在一台单独的机器上工作,但也许你可以建议我一个更好的方法。谢谢。

以上是关于Spring.datasource.initialize=false 不工作的主要内容,如果未能解决你的问题,请参考以下文章