具有 2 个不同数据库名称的 MySQL JDBC URL 故障转移

Posted

技术标签:

【中文标题】具有 2 个不同数据库名称的 MySQL JDBC URL 故障转移【英文标题】:MySQL JDBC URL Failover with 2 different database names 【发布时间】:2017-07-10 21:00:00 【问题描述】:

我想在 SpringBoot 应用程序中的 application.yml 中有一个带有 2 个不同架构/数据库名称的 jdbc url。

我通过关注Reference Link 尝试了这些,但不幸的是我无法让它工作。

jdbc:mysql://address=(type=master)(protocol=tcp)(host=IP1)(port=3306)(user=root)(password=root)/dbname1?failOverReadOnly=false,address=(type=master)(protocol=tcp)(host=IP2)(port=3306)(user=test)(password=test)/dbname2?failOverReadOnly=false

jdbc:mysql://address=(type=master)(protocol=tcp)(host=IP1)(port=3306)(user=root)(password=root)(dbname=dbname1)?failOverReadOnly=false,address=(type=master)(protocol=tcp)(host=IP2)(port=3306)(user=test)(password=test)(dbname=dbname2)?failOverReadOnly=false

我收到的错误是在启动应用程序时,因为 MySQL 连接器无法解析 url 连接字符串。

2017-02-21 11:37:40.724] log4j - 3060 ERROR [main] --- o.a.t.j.p.ConnectionPool: Unable to create initial connections of pool.
java.sql.SQLException: The connection property 'failOverReadOnly' only accepts values of the form: 'true', 'false', 'yes' or 'no'. The value 'false,address=(type=master)(protocol=tcp)(host=localhost)(port=3306)(user=test)(password=test)/dbname2?failOverReadOnly=false' is not in this set.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)

【问题讨论】:

您遇到错误了吗? 我在启动服务器并且连接器解析连接 url 时收到错误 错误信息和您粘贴的代码不匹配。在您的代码中,它显示“user=root”,错误显示“user=test”(以及其他差异)。 【参考方案1】:

这是一个旧线程,我不知道您是否找到了适合您的解决方案。

但我也遇到过类似的情况,下面的 JDBC URL 对我来说就像一个魅力

"jdbc:mysql://IP1:port1,IP2:port2/CommonDbName?failOverReadOnly=false"

在这种情况下,在任何时候,您的应用程序都将仅连接到一个位于 IP1 上的数据库,一旦该数据库关闭,它将切换到第二个数据库,即 IP2,并且由于您已标记failOverReadOnly为 false,第二个 DB 将在读/写模式下都处于活动状态。

参考-

8.1 Configuring Server Failover

【讨论】:

始终在您的问题/答案中格式化您的代码。另外,请提供一些官方文档参考(尽可能)以支持您的回答【参考方案2】:

我猜,错误信息很简单-The connection property 'failOverReadOnly' only accepts values of the form: 'true', 'false', 'yes' or 'no'. The value 'false,address=(type=master)(protocol=tcp)(host=localhost)(port=3306)(user=test)(password=test)/dbname2?failOverReadOnly=false' is not in this set.

您的财产价值 - failOverReadOnly 被视为 - false,address=(type=master)(protocol=tcp)(host=localhost)(port=3306)(user=test)(password=test)/dbname2?failOverReadOnly=false 而不是简单的 false

格式 -

jdbc:mysql://address=(key1=value)[(key2=value)]...[,address=(key3=value)[(key4=value)]...]...[/[database]]»
[?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

指定首先列出所有address,然后在最后列出所有属性,而您在一个地址之后编写属性。

总而言之,您的 URL 不是文档中提到的格式。

希望对你有帮助!!

【讨论】:

我如何设法让 propertyName1 引用 address1 但 propertyName2 引用 address2 ? 我猜,对这些属性似乎有些误解。这些不是地址特定属性,而是整体配置属性,即故障转移的工作方式等。

以上是关于具有 2 个不同数据库名称的 MySQL JDBC URL 故障转移的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法为 2 个具有不同包名称的应用程序提供 1 个 Firebase 数据库?

JDBC

MySql JDBC url 参数详解

PHP:具有不同名称的多个按钮以使用 AJAX 更新 MySQL 数据库

mysql JDBC URL格式各个参数详解

MySQL Workbench - 如何在同一台服务器上克隆具有不同名称的数据库?