gpt4 book ai didi

java - 微服务——在不改变代码的情况下改变服务到底意味着什么?

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:16 25 4
gpt4 key购买 nike

我试图理解“更改数据库而不更改代码”。目前使用 springboot、java、thymeleaf 和 cloud foundry 来处理微服务。

我有一个 Spring Boot 应用程序,并使用 Cloud Foundry 附加了一个数据库即服务。

我的问题是,我发现微服务的目的是允许在不更改代码的情况下轻松更改服务。

这就是我陷入困境的地方

在java中我有一个sql脚本,“select * from ORDER where Status = 'ACCEPTED';”

图像 source

Table sample

我的数据库将使用 CUPS 作为 Cloud Foundry 上的服务附加“jdbc:oracle:thin:用户名/密码//主机:端口/服务名”

假设我想将此数据库更改为 CUSTOMER 表(将其视为不同的数据库)。这将引发错误,因为 CUSTOMER 表不会有“select * from ORDER where Status = 'ACCEPTED';”

我已经更改了数据库,但是我是否仍然需要返回到我的代码并更改 sql 脚本?

我尝试解决此问题

  1. 因此,不要在 java 中硬编码我的 sql 脚本“select * from ORDER where Status = 'ACCEPTED';”

  2. 我创建了一个系统环境变量并将其设置为 sqlScript,其值为 select * from ORDER where Status = 'ACCEPTED'

  3. 然后在java中我调用了env变量 String sqlScript= System.getenv("sqlScript");

  4. 所以现在用户可以通过环境变量来更改它,而不是返回 java 来更改 SQL 脚本。

这是解决我的问题的一种非常肮脏的方法,什么是更好的替代方法?

我知道我的理解逻辑实在是错误的。请引导我走上正确的道路。

最佳答案

我认为“在不更改代码的情况下更改数据库”这句话并不意味着如果您在数据库中添加/删除字段,则不必修改代码库 - 它没有任何意义。

它的真正含义是您应该使用良好的数据库抽象,因此,如果您需要将数据库供应商从 MYSQL 更改为 OracleDB,您的 Java 代码应该保持不变。唯一可能不同的是一些配置。

一个很好的例子是 ORM,比如 Hibernate。无论您使用的 SQL 数据库是什么,您都只需编写一次 Java 代码。要切换数据库,您唯一需要更改的是方言配置属性(实际上这并不容易做到,但可能比我们耦合到一个特定的数据库更容易)。

Hibernate 为您提供了对 SQL 数据库的良好抽象。如今我们有一个新的趋势——对 SQL 和 NoSQL 等不同的数据库系列进行抽象。 因此,在理想的情况下,即使您想将 MySQL 更改为 MongoDB 甚至 Neo4j,您的代码库也应该保持不变Spring Data可能是试图解决这个问题的最流行的框架。我最近发现的另一个框架是Kundera但到目前为止我还没有使用过。

所以回答你的问题 - 你不需要将 SQL 查询保留为系统变量。您所需要做的就是在您选择的语言中使用适当的抽象。

关于java - 微服务——在不改变代码的情况下改变服务到底意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43661844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com