3

我正在将 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 的一个被忽视的功能将是理想的。

非常感谢 :)

4

2 回答 2

1

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

当涉及到 OO 设计时,上述解决方案通常是最佳实践。

于 2015-02-20T07:34:20.090 回答
-1

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

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

于 2015-09-10T12:09:32.747 回答