以编程方式在本地数据库和 Google 云 SQL 之间切换

Switch between local database and Google Cloud SQL programmatically

我正在 Spring Boot 中开发一个项目,该项目到目前为止只使用本地 Postgres 数据库。但是,我们现在正在努力将应用程序部署到 Google 云平台,这涉及使用云 SQL。我找到了几个关于如何连接到 Cloud SQL 的指南,并决定遵循 this one

但是,我们负担不起在云中 运行 也有单独的开发数据库 SQL,因此希望继续使用本地 Postgres 数据库进行开发。为此,我编写了以下代码:

@Configuration
@EnableTransactionManagement
public class PersistenceContext {
    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(System.getenv("DB_URL"));
        dataSource.setUsername(System.getenv("DB_USER"));
        dataSource.setPassword(System.getenv("DB_PASS"));

        String dbInstance = System.getenv("DB_INSTANCE");

        if (dbInstance != null && !dbInstance.isEmpty()) {
            Properties connectionProperties = new Properties();
            connectionProperties
                .setProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory");
            connectionProperties.setProperty("cloudSqlInstance", dbInstance);

            dataSource.setConnectionProperties(connectionProperties);
        }

        return dataSource;
    }
}

有了这个,我希望只要不指定云 SQL 套接字工厂和 dbInstance 就可以让我使用本地数据库。但是,当尝试 运行 仅设置了数据库 url、用户和密码变量的应用程序时,我 运行 出现以下异常:

java.lang.IllegalArgumentException: An instance connection name must be provided in the format <PROJECT_ID>:<REGION>:<INSTANCE_ID>.

可以找到完整的堆栈跟踪here

数据库URL配置如下:

DB_URL: jdbc:postgresql://localhost:5432/soundshare

如何以编程方式在数据库之间切换? (如果可以避免,我宁愿不将数据库详细信息存储在配置文件中)

谢谢!

因此,正如@Thomas Andolf 所提到的那样,自己在代码中做这件事并不是一个好主意,基本上是重新发明轮子。 "externalising" 您的配置有多种方法。

https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/html/boot-features-external-config.html

我个人喜欢尽可能使用 os 环境变量,因为当我部署为容器时,我也可以轻松地进行交换。

这是我正在处理的项目的 application.properties 文件的 cross 部分:

spring.datasource.url=${ospec_db_url} spring.datasource.username=${ospec_db_user:somedefault} spring.datasource.password=${ospec_db_password}

在我的开发系统上,我只是设置了环境变量,它就被拾取了。就我而言,我有一个包含如下变量的文本文件:

export ospec_db_url=jdbc:postgresql://localhost:5432/ospec_db
export ospec_db_password=somebadasspassword

我只是获取了文本文件并应用了它。我可以很容易地在项目之间切换。当你为 K8s 打包时,你可以从一个秘密文件读取到你的 env 变量,当你进入云时,你可以将值作为启动脚本中的变量传递。