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

VertX:检查数据库配置是否可用

淳于乐池
2023-03-14

我对微服务世界非常陌生,尤其是vertX。我希望我的顶点启动无论如何,即使没有可用的数据库连接(例如,配置中缺少数据库URL)。我已经设法做到了这一点,我的顶点开始了。

现在的问题是,我希望我的verticle注意到数据库连接何时再次可用并连接到它。我该怎么做?我考虑创建另一个垂直链接“DatabaseVerticle.java”,它将在事件总线上发送当前的DB配置,我的初始垂直链接将使用此消息,并检查配置信息是否一致(回复成功)或仍然缺少一些数据(回复失败并再次进行DatabaseVerticle检查)。

这可能行得通(也可能行不通),但对我来说似乎不是最佳解决方案。

如果有人能提出更好的解决方案,我会非常高兴。谢谢你!

共有3个答案

景光赫
2023-03-14

不是Vertx中的所有问题都应该由另一个顶点来解决。
在这种情况下,您可以使用。周期性()
http://vertx.io/docs/vertx-core/java/#_don_t_call_us_we_ll_call_you

我假设您有一些函数第一次检查数据库
我们称之为checkDB()

class PeriodicVerticle extends AbstractVerticle {

    private Long timerId;

    @Override
    public void start() {
        System.out.println("Started");
        // Should be called each time DB goes offline
        final Long timerId = this.vertx.setPeriodic(1000, (l) -> {

            final boolean result = checkDB();
            // Set some variable telling verticle that DB is back online
            if (result) {
                cancelTimer();
            }
        });

        setTimerId(timerId);

    }

    private void cancelTimer() {
        System.out.println("Cancelling");
        getVertx().cancelTimer(this.timerId);
    }

    private void setTimerId(final Long timerId) {
        this.timerId = timerId;
    }
}

在这里,我玩了一点timerId,因为我们不能马上把它传递给取消定时器()。但除此之外,这很简单。

焦苏燕
2023-03-14

理想的方法是使用其他服务告知您的服务数据库连接。无论是通过事件总线还是HTTP,您可以做的是,当有人试图在未建立连接的情况下访问您的数据库时,只需尝试进行一些DB调用并处理异常,将布尔值返回为false。现在,当您在事件总线上获得消息时,使用它并将其保存在某个配置pojo中。现在,当有人试图访问您的数据库时,请查找config,如果可用,请建立连接。

您的消费者:

public void start(){
    EventBus eb = vertx.eventBus();
    eb.consumer("database", message -> {
        config.setConfig(message.body());
    });
}

您的数据库客户端(Mongo for this eg):

public class MongoService{

    private MongoClient client;
    public boolean isAvailable = false;

    MongoService(Vertx vertx){
        if(config().getString("connection")){
            client = MongoClient.createShared(vertx, config().getString("connection"));
            isAvailable = true;
        }
    }
}
盖向荣
2023-03-14

对于您的用例,我建议使用vertx配置。特别是,请查看Vert的“侦听配置更改”部分。x配置文档。

您可以创建配置检索器并为更改设置处理程序:

ConfigRetrieverOptions options = new ConfigRetrieverOptions()
  .setScanPeriod(2000)
  .addStore(myConfigStore);

ConfigRetriever retriever = ConfigRetriever.create(vertx, options);
retriever.getConfig(json -> {
  // If DB config available, start the DB client
  // Otherwise set a "dbStarted" variable to false
});

retriever.listen(change -> {
  // If "dbStarted" is still set to false
  // Check the config and start the DB client if possible
  // Set "dbStarted" to true when done
});
 类似资料:
  • 问题内容: 将Apache Derby与Java结合使用(J2ME,但我认为这没有什么不同),是否有任何方法可以检查数据库是否已经存在并包含表? 问题答案: 除了MySQL之外,我什么都不知道,只有很少的解决方法,这与MySQL具有IF EXIST的功能不同。 您要做的是,尝试连接数据库,如果不可能的话。在成功建立连接之后,您可以执行简单的选择,例如SELECT count(*)FROM TABL

  • 问题内容: 建立连接后是否可以检查(MySQL)数据库是否存在。 我知道如何检查数据库中是否存在表,但是我需要检查数据库是否存在。如果没有,我必须调用另一段代码来创建它并填充它。 我知道所有这些听起来都不太优雅-这是一个快速又肮脏的应用程序。 问题答案: 如果您只想知道数据库是否存在,以免在尝试创建数据库时出错,只需使用(From here):

  • 问题内容: 我需要使用SQL查询来检查数据库是否完全为空(无表)。如何才能做到这一点? 谢谢您的帮助! 问题答案: 将返回数据库中表(或视图)的实际数量。如果该数字为0,则没有表。

  • 我正在将行插入房间数据库,我想检查该行是否已成功插入。 这是我的刀 当我插入一行时,响应为1、2、3,依此类推。。所以它返回的是(是这样吗?) 因此,需要检查行是否正确插入。 我是否可以检查插入的rowId是否大于0,然后将其成功插入数据库。 注意:我得到的结果是1,2,3等,应该是rowId。 请建议这种方法是否正确?基本上,如果插入不成功,我想阻止用户继续 谢谢你的建议和意见

  • 我有一个名为的以下数据 有没有什么方法我可以使用而不需要实际遍历它们并检查其中的一个? 当我时,我会得到上面提到的结果。但我想检查是否有任何答案由一个特定的用户名。 我需要类似的内容

  • 问题内容: 我已经在互联网上搜索了几天,但找不到仅使用ODBC和SQL来解决此问题的通用方法。 有没有办法查看数据库是否已经存在,只能使用 ODBC 。它必须是标准SQL,因为用户可以选择自己选择的DSN(意味着他自己的SQL Server)。 这意味着我无法检查服务器上的主表,因为在不同的SQL服务器上它们的名称不同。 谢谢。 问题答案: 不知道这是否为时已晚,或者对于您来说足够“便携”。 我只