将 java 网络应用程序设置为 运行 每个 SQL 脚本仅一次
Setup java web application to run each SQL script only once
问题
我和我的大学朋友一起制作 Web 应用程序,我们最近遇到了以下问题。服务器与远程存储库同步 (git)。每个人都可以 运行 在本地应用程序,并在他的本地机器上拥有自己的本地数据库。 Web 托管上的数据库已插入服务器上的应用程序。当有人想要更改数据库中的某些内容时,他会编写一个 sql 脚本将其推送到存储库 运行 ,然后 运行 在服务器上并确保每个开发人员也执行它。这对我们来说似乎很不舒服。
坏主意
解决方案是让每个人都连接到同一个数据库。但恕我直言,这是个坏主意,因为:
- 我们需要为 SQL 购买另一个网络主机,因为 运行ning 目前是为全球用户提供的。出于安全和测试原因,我们需要另一个。
- 拥有一个对世界可见的数据库,仅使用简单的密码进行保护,对我来说似乎很危险。当前数据库配置为仅在本地可见(当然在本地相对于服务器),因此通常它对 Web 服务器可见,如果需要,开发人员可以通过 ssh 访问。
- 性能原因。考虑到开发人员使用它(更复杂的查询,测试站点大量 jUnit 测试),连接到远程数据库而不是本地数据库会慢十几倍,这将是非常痛苦的解决方案。
好主意
前段时间在公司工作,问题解决如下。有一个 Maven 插件配置为 运行 每个 sql 指定目录中的脚本在应用程序构建期间仅执行一次(mvn clean install),即它会记住哪个脚本已经执行并保留它。例如,假设有人想要更改数据库新列中的某些内容。然后他编写脚本将其推送到存储库,然后他什么都不用担心,因为脚本会在应用程序构建期间自动为他、服务器和所有其他开发人员执行。
怎么做
很遗憾,我找不到该插件或配置。老实说,我在网上找不到任何与我的问题相关的信息,这令人惊讶,因为这对我来说似乎是一个常见问题。那么我可以通过一些 Maven 插件来完成吗?也许有办法通过适当的 Spring 配置来做到这一点。如果我被迫手动执行(在应用程序启动时在 Java 中),我需要什么工具、任何建议、class 模式?
期待您的帮助。也很抱歉我的英语不是母语。
只是猜测,但也许您工作的公司使用了 liquibase 或 flyway。
对于也可以通过 Maven 使用的 liquibase,可以在此处找到信息:http://www.liquibase.org/, specifically for the maven integratation here: http://www.liquibase.org/documentation/maven/index.html
Spring 也带有 liquibase 集成,可以在这里找到信息:http://www.liquibase.org/documentation/spring.html or in addition, if you're using spring boot: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
另一种可能的数据库迁移解决方案是 flyway:您的文档入口点:http://flywaydb.org/
问题
我和我的大学朋友一起制作 Web 应用程序,我们最近遇到了以下问题。服务器与远程存储库同步 (git)。每个人都可以 运行 在本地应用程序,并在他的本地机器上拥有自己的本地数据库。 Web 托管上的数据库已插入服务器上的应用程序。当有人想要更改数据库中的某些内容时,他会编写一个 sql 脚本将其推送到存储库 运行 ,然后 运行 在服务器上并确保每个开发人员也执行它。这对我们来说似乎很不舒服。
坏主意
解决方案是让每个人都连接到同一个数据库。但恕我直言,这是个坏主意,因为:
- 我们需要为 SQL 购买另一个网络主机,因为 运行ning 目前是为全球用户提供的。出于安全和测试原因,我们需要另一个。
- 拥有一个对世界可见的数据库,仅使用简单的密码进行保护,对我来说似乎很危险。当前数据库配置为仅在本地可见(当然在本地相对于服务器),因此通常它对 Web 服务器可见,如果需要,开发人员可以通过 ssh 访问。
- 性能原因。考虑到开发人员使用它(更复杂的查询,测试站点大量 jUnit 测试),连接到远程数据库而不是本地数据库会慢十几倍,这将是非常痛苦的解决方案。
好主意
前段时间在公司工作,问题解决如下。有一个 Maven 插件配置为 运行 每个 sql 指定目录中的脚本在应用程序构建期间仅执行一次(mvn clean install),即它会记住哪个脚本已经执行并保留它。例如,假设有人想要更改数据库新列中的某些内容。然后他编写脚本将其推送到存储库,然后他什么都不用担心,因为脚本会在应用程序构建期间自动为他、服务器和所有其他开发人员执行。
怎么做
很遗憾,我找不到该插件或配置。老实说,我在网上找不到任何与我的问题相关的信息,这令人惊讶,因为这对我来说似乎是一个常见问题。那么我可以通过一些 Maven 插件来完成吗?也许有办法通过适当的 Spring 配置来做到这一点。如果我被迫手动执行(在应用程序启动时在 Java 中),我需要什么工具、任何建议、class 模式?
期待您的帮助。也很抱歉我的英语不是母语。
只是猜测,但也许您工作的公司使用了 liquibase 或 flyway。 对于也可以通过 Maven 使用的 liquibase,可以在此处找到信息:http://www.liquibase.org/, specifically for the maven integratation here: http://www.liquibase.org/documentation/maven/index.html
Spring 也带有 liquibase 集成,可以在这里找到信息:http://www.liquibase.org/documentation/spring.html or in addition, if you're using spring boot: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
另一种可能的数据库迁移解决方案是 flyway:您的文档入口点:http://flywaydb.org/