【问题标题】:Spring app should start even though DB is down即使 DB 关闭,Spring 应用程序也应该启动
【发布时间】:2015-10-22 19:39:33
【问题描述】:

我有一个 spring 应用程序,它对 DB 执行最少的操作。 而且我要求我的应用程序应该在没有 DB 的情况下运行(或者当 db 关闭时)。下面是我的数据源配置。

<bean id="dt31DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" depends-on="systemPropertyInitializer"
                      p:driverClass="${dt31.driver_class}"
                      p:jdbcUrl="${dt31.url}"
                      p:user="${dt31.username}"
                      p:password="${dt31.password}"
                      p:idleConnectionTestPeriod="1000"
                      p:maxPoolSize="4"
                      p:minPoolSize="2"
                      p:maxIdleTime="2000"
                      p:unreturnedConnectionTimeout="600"
                      p:contextClassLoaderSource="library"
                      p:privilegeSpawnedThreads="true"
                      p:initialize=false
                      />

    <bean id="dt31SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dt31DataSource"/>
        <property name="packagesToScan" value="com.t22.dt31"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    ${dt31.dialect}
                </prop>
                <prop key="hibernate.show_sql">
                    false
                </prop>
                <prop key="hibernate.hbm2ddl.auto">
                    update
                </prop>
            </props>
        </property>
    </bean>

我在谷歌找到了一个page,说在spring数据源配置中使用“initialize:false”。但是我使用的是没有这个属性的“ComboPooledDataSource”数据源。还有其他方法可以实现吗?

【问题讨论】:

  • Spring 应用程序将启动,即使 DB 已关闭,因为您的登录页面没有实例化任何在 DB 中有表的模型类。所以你可以显示一个页面,如果这是你想要的,但我不明白目的。
  • Borg,感谢您的及时评论。当我的应用程序最初加载时,它正在尝试创建实习生需要数据源配置的会话工厂 bean。我认为 ComboPooledDataSource bean 正在加载阶段准备与数据库的连接,并且由于数据库关闭,它失败了。抛出错误,例如:未能获取资源,com.mchange.v2.resourcepool.BasicResourcePool@5ff26372 正在中断所有等待资源检查的线程。
  • 是的,因为您的组合事物中有连接超时、空闲测试期。我建议删除它。对于初学者,最好使用简单的数据源。其次,请问您为什么会有这样的要求,这样做有什么好处?我很好奇..
  • 我会测试你的建议。意思是,当我给出我的要求时,我的应用程序将主要使用文件系统,而很少使用 DB。在启动时,我的应用程序将运行一些仅处理文件的迁移脚本系统,一旦应用程序启动,如果用户在 UI 中执行了一些操作,那么它将处理 DB。所以在启动时,有时我的 DB 可能已关闭或可能不存在。

标签: java spring hibernate orm spring-data


【解决方案1】:

应用程序服务层可以与两个 DAO 层(文件系统和数据库)一起操作,因此当 DB 关闭时,您会捕获连接获取异常并切换到文件系统。

拥有两个事实来源将难以在两个不同的数据源之间保持一致性,尤其是在一个资源不可用的情况下。

当这两种资源都可用时,您可以使用 XADisk 和 Bitronix 进行 XADataSource 和 JTA 事务管理。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2020-12-07
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多