【问题标题】:Remove Cassandra connectivity as hard Spring startup dependency删除 Cassandra 连接作为硬 Spring 启动依赖项
【发布时间】:2015-04-21 02:40:47
【问题描述】:

我将 Spring Data 与 Cassandra 一起使用,并希望在错误预防和处理方面尽可能具有弹性。目前,我们通过使用我们自己的实现来包装我们的com.datastax.cassandra.Session,该实现创建一个嵌套实例(实际上是一个代理),如下所示:

private class CassandraSessionProxy implements Session {
    private Session cassandraSession;
    private Session cassandraSession() {
        if (cassandraSession != null) {
            return cassandraSession;
        } else {
            synchronized (this) {
                try {
                    cassandraSession = createCassandraSession();
                    return cassandraSession;
                } catch (Exception e) {
                    LOGGER.error("An error happened but after Spring's container started", e);
                }
            }
        }
    }
    // implement Session methods, proxying to cassandraSession field
    @Override
    public void close() {
        cassandraSession().close();
    }
}

我们的 Session 实现中的所有代理方法都通过一个同步块访问 cassandraSession 字段,该块检查它是否存在,如果不存在则创建连接,捕获 Spring 启动范围之外的任何异常。

好奇是否有更巧妙的方法来实现这一点。 datastax 的本机驱动程序或 spring-data 的一个被忽视的功能将是理想的。

非常感谢:)

【问题讨论】:

标签: cassandra spring-data datastax datastax-java-driver spring-data-cassandra


【解决方案1】:

会话是一个接口。为什么不简单地构造一个构造 Session 实例的 SessionBuilder 呢?然后你可以让它返回一个基本的 Cassandra 会话,直到你需要其他东西。

上述解决方案通常是面向 OO 设计的最佳实践。

【讨论】:

  • Cassandra Session 抛出停止 Spring 启动的错误。
【解决方案2】:

您没有正确使用同步。您对 null 的检查不是任何先发生流程的一部分,因此无法保证结果。

我会改用静态保持器,甚至根本不使用延迟初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多