Java 以编程方式在本地数据库和Google云SQL之间切换
我在SpringBoot上做一个项目,到目前为止,它只使用本地Postgres数据库。然而,我们现在正在将该应用程序部署到谷歌云平台,这涉及到使用云SQL。我找到了一些关于如何连接到云SQL的指南,并决定遵循这些指南 然而,我们不能让单独的开发数据库也运行在云SQL中,所以我们希望继续使用本地Postgres数据库进行开发。为此,我编写了以下代码: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
@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进行测试和生产,而不是切换代码。使用代码进行测试是不好的做法,因为在生产/测试中会有死代码