Java 如何在没有数据库连接的情况下部署spring应用程序

Java 如何在没有数据库连接的情况下部署spring应用程序,java,spring,hibernate,Java,Spring,Hibernate,我的SpringWebApp使用PostgreSQL,只有一些功能是数据库绑定的。我希望在不存在数据库连接的情况下部署应用程序 如果没有数据库,数据源bean在启动时就会崩溃。。。当bean创建错误停止应用程序初始化时,所有后续请求都会以HTTP 500s的形式失败 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' define

我的SpringWebApp使用PostgreSQL,只有一些功能是数据库绑定的。我希望在不存在数据库连接的情况下部署应用程序

如果没有数据库,数据源bean在启动时就会崩溃。。。当bean创建错误停止应用程序初始化时,所有后续请求都会以HTTP 500s的形式失败

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [database.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
    etc.
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:805)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343)
    etc.
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to obtain JDBC Connection
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
    etc.
Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:247)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:146)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35)
    etc.
org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactory”的bean时出错(在类路径资源[database.xml]中定义):调用init方法失败;嵌套异常为javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
等
原因:javax.persistence.PersistenceException:[PersistenceUnit:default]无法生成Hibernate SessionFactory
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877)
位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:805)
位于org.springframework.orm.jpa.vendor.springhibernatejbapersistenceprovider.createContainerEntityManager工厂(springhibernatejbapersistenceprovider.java:60)
位于org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343)
等
原因:org.hibernate.exception.JDBCConnectionException:无法获取JDBC连接
位于org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115)
位于org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
等
原因:org.postgresql.util.PSQLException:与本地主机的连接被拒绝:5432。检查主机名和端口是否正确,邮政局长是否接受TCP/IP连接。
位于org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:247)
位于org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
位于org.postgresql.jdbc2.AbstractJdbc2Connection。(AbstractJdbc2Connection.java:146)
位于org.postgresql.jdbc3.AbstractJdbc3Connection。(AbstractJdbc3Connection.java:35)
等
数据源定义

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/sadb" />

    <property name="username" value="sa" />
    <property name="password" value="password" />
</bean>


这应该是可能的吗?我已经做了很多搜索,但找不到任何相关内容。

尝试使用嵌入式内存数据库,如h2或hsqldb

<jdbc:embedded-database id="dataSource" type="HSQL"/>


如果您不想使用jdbc名称空间

<bean id="dataSource"  class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="org.h2.Driver"/>
        <property name="url" value="jdbc:h2:mem:test"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
</bean> 

我还没有测试过它,但是通过设置lazy init=“true”将数据库相关bean标记为lazy-loaded来检查它是否有效。大概是这样的:

<bean id="dataSource"  class="org.springframework.jdbc.datasource.SimpleDriverDataSource" lazy-init=”true”>
    <property name="driverClass" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:mem:test"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>


我们在项目中遇到了相同的问题,我们通过实例化解决了这个问题 将bean延迟(lazy init=“true”)如下所示:

    <bean id="myProjectDataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" 
    lazy-init="true">

我不知道应用程序中的DB必需部分和非必需部分是否清楚分开。如果为true,您可以尝试使用springprofile来定义在没有DB连接时不应激活哪些bean。我没有做任何测试,只是一个想法,所以请留下评论。
    <bean id="myProjectDataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" 
    lazy-init="true">