即使 DB 关闭,Spring 应用程序也应该启动
Posted
技术标签:
【中文标题】即使 DB 关闭,Spring 应用程序也应该启动【英文标题】:Spring app should start even though DB is down 【发布时间】: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 可能已关闭或可能不存在。 【参考方案1】:应用程序服务层可以与两个 DAO 层(文件系统和数据库)一起操作,因此当 DB 关闭时,您会捕获连接获取异常并切换到文件系统。
拥有两个事实来源将难以在两个不同的数据源之间保持一致性,尤其是在一个资源不可用的情况下。
当这两种资源都可用时,您可以使用 XADisk 和 Bitronix 进行 XADataSource 和 JTA 事务管理。
【讨论】:
以上是关于即使 DB 关闭,Spring 应用程序也应该启动的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 和 Hibernate:即使与数据库的连接不可用也启动应用程序
如何在不依赖数据库的情况下使用 Hibernate 5 (JPA) 启动 Spring Boot Application 2?
Flyway、Spring Boot 和应用程序在没有数据库的情况下启动
停止 spring boot 应用程序启动,直到 spring cloud config server 启动