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 个选择
- 使用配置文件
- 在指定位置之一的每个环境中使用不同的
application.properties
。
要使选项 1 起作用,请在您的 application.properties
中设置一些默认值(可能是生产中的)。并创建一个 application-dev.properties
包含你的内存中的东西。
现在,在启动您的应用程序之前,要么创建一个名为 spring.active.profiles=dev
的环境变量,要么将其传递给启动您的应用程序 -Dspring.active.profiles=dev
。
现在当您启动您的应用程序时,application.properties
和 application-dev.properties
都将被加载。后者覆盖默认属性的任何属性。
我有一个 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 个选择
- 使用配置文件
- 在指定位置之一的每个环境中使用不同的
application.properties
。
要使选项 1 起作用,请在您的 application.properties
中设置一些默认值(可能是生产中的)。并创建一个 application-dev.properties
包含你的内存中的东西。
现在,在启动您的应用程序之前,要么创建一个名为 spring.active.profiles=dev
的环境变量,要么将其传递给启动您的应用程序 -Dspring.active.profiles=dev
。
现在当您启动您的应用程序时,application.properties
和 application-dev.properties
都将被加载。后者覆盖默认属性的任何属性。