当前位置: 首页 > 知识库问答 >
问题:

使用galera Mariadb与jdbc

沈琨
2023-03-14

我已经创建了一个Mariadb集群,我正在尝试让一个Java的应用程序能够在其中一个主机死亡时故障转移到另一个主机。

我创建了一个应用程序,它使用"jdbc: mysql:序列://host1, host2, host3/数据库?socketTimeout=2000

假设我不必处理异常并显式重试查询,这是错误的吗?为了实现这一点,我还需要配置其他东西吗?


共有2个答案

澹台蕴藉
2023-03-14

故障转移并不意味着应用程序不必处理异常。

当连接丢失时,驱动程序将尝试重新连接到另一台服务器。

如果驱动程序无法重新连接到另一台服务器,则会抛出SQLNon⃣entConnectionException,池将自动丢弃这些连接。

如果连接恢复,在某些边缘情况下重新启动查询是安全的:例如,当查询不在事务中,并且连接当前处于只读模式(使用Spring@Transactional(只读=false))时。对于这些情况,MariaDb html" target="_blank">java连接将自动重新启动查询。在这些特定情况下,不会引发异常,并且故障转移是透明的。

驱动程序无法在事务期间重新执行当前查询。
即使没有事务,如果 query 是 UPDATE 命令,驱动程序也无法知道数据库服务器是否已接收并执行了最后一个请求。

然后,驱动程序将发送一个SQLException(SQLState从“25”开始= INVALID_TRANSACTION_STATE),由应用程序来处理这些情况。

蒙光华
2023-03-14

由于以下原因,自动重新连接是危险的。假设您有以下代码:

BEGIN;
SELECT ... FROM tbl WHERE ... FOR UPDATE;
(line 3)
UPDATE tbl ... WHERE ...;
COMMIT;

现在假设服务器在(第3行)崩溃。事务将回滚。在我虚构的示例中,这只涉及释放tbl上的锁。

现在假设其他连接在您自动重新连接时成功地在同一行上执行了相同的事务。

现在,通过自动重新连接,第一个线程不会注意到事务的前半部分已经回滚,并根据现在过期的数据继续执行UPDATE。

您需要获得一个异常,以便您可以返回BEGIN,以便您可以“事务安全”。

无论如何,你都需要这个——有了Galera,没有崩溃,类似的事情也可能发生。两个线程同时在两个不同的节点上执行该事务……每个线程都成功,直到到达COMMIT,此时发生了Galera魔术,其中一个COMMIT被告知失败。“正确”响应是在选择失败的服务器上重播整个事务。

请注意,与非加莱拉不同,伽列拉需要在 COMMIT 上检查错误。

更多Galera提示(针对从非Galera迁移的开发人员和dba)

 类似资料:
  • 问题内容: 我有一个多线程函数,我想使用一个状态栏。有没有一种简单的方法来显示状态栏?正是并行化部分使我感到困惑。 问题答案: 你可以用周围,如下跟踪进度: 这是您的示例: 结果是这样的:

  • 是否有任何示例项目展示了如何将Kafka与Micronaut结合使用?我很难让它工作。 我有以下制片人: 听众: 我的申请。yml包含: 以及应用测试。yml(这是正确的吗?它应该与application.yml位于同一目录中吗?还不确定嵌入式服务器应该如何使用): 我的测试结果如下: 我面临的主要问题是: > 我的消费者没有从我的主题中消费。我可以看到制作者在Kafka中创建了主题,并且创建了客

  • Mesos 安装与使用 以 Mesos 结合 Marathon 应用框架为例,来看下如何快速搭建一套 Mesos 平台。 Marathon 是可以跟 Mesos 一起协作的一个 framework,基于 Scala 实现,可以实现保持应用的持续运行。 另外,Mesos 默认利用 ZooKeeper 来进行多个主节点之间的选举,以及从节点发现主节点的过程。一般在生产环境中,需要启动多个 Mesos

  • go get github.com/gorilla/websocket go get github.com/valyala/fasthttp go get github.com/hprose/hprose-golang 使用 Hello 服务端 package main   import ( "net/http"   "github.com/hprose/hprose-golang

  • 问题内容: 在哪种情况下,应该只在实际部署中将Node.js用作服务器? 当一个人 不 希望只使用Node.js的,有什么用Node.js的发挥更好?Apache还是Nginx? 问题答案: 将另一个Web服务器放在Node.js前面有几个充分的理由: 不必担心Node.js进程的特权/ setuid。通常只有root可以绑定到端口80。如果让nginx / Apache担心以root身份启动,绑

  • 问题内容: 我已经看到许多特定的案例,人们在询问,人们在解释两者之间的区别,但我似乎也不能理解一般的区别。这两个是同义词吗?一个暗示另一个吗? 问题答案: 这两个是同义词吗? 号说:“嘿,Android(及相关的发行渠道),请让用户允许我做X”。说:“嘿,Android(及相关的发行渠道),我有兴趣在具有Y功能的硬件上运行”。 如果硬件不符合您的要求,但用户不参与,则可能会将您从Play商店(和其