Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式在本地数据库和Google云SQL之间切换_Java_Postgresql_Spring Boot_Google Cloud Platform_Google Cloud Sql - Fatal编程技术网

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

Java 以编程方式在本地数据库和Google云SQL之间切换,java,postgresql,spring-boot,google-cloud-platform,google-cloud-sql,Java,Postgresql,Spring Boot,Google Cloud Platform,Google Cloud Sql,我在SpringBoot上做一个项目,到目前为止,它只使用本地Postgres数据库。然而,我们现在正在将该应用程序部署到谷歌云平台,这涉及到使用云SQL。我找到了一些关于如何连接到云SQL的指南,并决定遵循这些指南 然而,我们不能让单独的开发数据库也运行在云SQL中,所以我们希望继续使用本地Postgres数据库进行开发。为此,我编写了以下代码: @Configuration @EnableTransactionManagement public class PersistenceContex

我在SpringBoot上做一个项目,到目前为止,它只使用本地Postgres数据库。然而,我们现在正在将该应用程序部署到谷歌云平台,这涉及到使用云SQL。我找到了一些关于如何连接到云SQL的指南,并决定遵循这些指南

然而,我们不能让单独的开发数据库也运行在云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;
    }
}
因此,我希望只要不指定cloudsqlsocketfactory和dbInstance,就可以使用本地数据库。但是,当尝试仅使用DB url、用户和密码变量集运行应用程序时,我遇到以下异常:

java.lang.IllegalArgumentException:实例连接名称的格式必须为

可以找到完整的堆栈跟踪

DB URL的配置如下所示:

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

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


谢谢

因此,像@Thomas Andolf提到的那样,自己编写代码不是一个好主意,基本上是重新发明轮子。有几种方法可以“外部化”您的配置

就我个人而言,我喜欢在可能的时候使用os环境变量,因为当我部署为容器时,我可以轻松地携带它

这是我正在处理的项目的application.properties文件的横截面:

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

在我的开发系统上,我只需设置环境变量,它就会被拾取。在我的例子中,我有一个文本文件,其中包含如下变量:

导出ospec_db_url=jdbc:postgresql://localhost:5432/ospec_db
导出ospec_db_password=somebadasspassword


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

什么是完整的stacktrace,以及开发环境中的
DB\u URL
是什么?@Kayaman我在原始帖子中添加了stacktrace的链接以及开发环境中配置的环境变量。啊,你有一个gcpautoconfiguer试图连接到云。您可能希望使用Spring概要文件,因此可以对概要文件
dev
禁用它。我会告诉你怎么做的,但目前我的工作内存中有3个不同版本的Spring,它们都是以完全不同的方式配置的……或者用手动配置.switch代替自动配置,使用单独的application.properties进行测试和生产,而不是切换代码。使用代码进行测试是不好的做法,因为在生产/测试中会有死代码