spring 如何在开发中使用内存数据库,在生产中使用普通数据库?

How to use in-memory db in development and normal db in production in spring?

我有一个 spring-boot/spring-data-rest 项目。我希望能够根据某些环境变量使用 in-memory/normal db。这可能吗?

现在我只是用生产数据库的参数注释掉我的应用程序配置

#spring.jpa.database=POSTGRESQL
#spring.datasource.platform=postgres
...

是的,可以使用 Spring profile

您可以定义不同的个人资料,并根据您的要求激活您的任何个人资料。

可以参考@MkyongSpring Profiles example

我使用 maven 进行此配置。可以使用您想要的参数创建 Maven 配置文件。例如:

<profiles>
<profile>
    <id>db-local</id>
    <properties>
        <spring.profile.name>dbcp</spring.profile.name>
        <hibernate.dialect>org.hibernate.dialect.HSQLDialect</hibernate.dialect>
        <hibernate.driver>org.hsqldb.jdbcDriver</hibernate.driver>
        ...
    </properties>
</profile>

<profile>
    <id>db-central</id>
        <properties>
        <spring.profile.name>dbcp</spring.profile.name>
        <hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</hibernate.dialect>
        <hibernate.driver>oracle.jdbc.driver.OracleDriver</hibernate.driver>
        ...
    </properties>
</profile>

...

然后您可以在 java 代码或 xml 描述符中定义此变量,如下所示:${hibernate.dialect}.

如果您这样做,则 Maven 必须在 compiling/packaging 之前过滤此文件以替换 Maven 变量。这可以使用 maven 资源插件或 maven war 插件来完成。

这里是maven过滤的例子:

<plugins>
    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <webResources>
                <resource>
                    <filtering>true</filtering>
                    <directory>src/main/webapp</directory>
                    <includes>
                        <include>WEB-INF/web.xml</include>
                        <include>WEB-INF/springConfig/app-bbdd-dbcp.xml</include>
                        <include>WEB-INF/springConfig/app-security.xml</include>
                    </includes>
                </resource>
            </webResources>
        <configuration>
    </plugin>
</plugins>

您可以通过 Maven 变量激活或停用 spring 插件。

在这里您可以看到一个完整的工作项目,正如我向您描述的那样:https://github.com/malaguna/casiopea

我强烈建议阅读 Spring Profiles and how Spring Boot utilizes that to load different config files

所以基本上你有 2 个选择

  1. 使用配置文件
  2. 在指定位置之一的每个环境中使用不同的 application.properties

要使选项 1 起作用,请在您的 application.properties 中设置一些默认值(可能是生产中的)。并创建一个 application-dev.properties 包含你的内存中的东西。

现在,在启动您的应用程序之前,要么创建一个名为 spring.active.profiles=dev 的环境变量,要么将其传递给启动您的应用程序 -Dspring.active.profiles=dev

现在当您启动您的应用程序时,application.propertiesapplication-dev.properties 都将被加载。后者覆盖默认属性的任何属性。