Я использую 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 была бы идеальной.
Весьма признателен :)
2 ответа
Сессия — это интерфейс. Почему бы вам просто не создать SessionBuilder, который создает экземпляр Session? Затем вы можете заставить его вернуть базовый сеанс Cassandra, пока вам не понадобится что-то еще.
Приведенное выше решение обычно является лучшей практикой, когда дело доходит до объектно-ориентированного проектирования.
Вы неправильно используете синхронизацию. Ваша проверка на нуль не является частью какого-либо потока, происходящего до того, как результаты не гарантируются.
Вместо этого я бы использовал статический держатель или вообще не использовал ленивую инициализацию.
Похожие вопросы
Связанные вопросы
Новые вопросы
cassandra
Apache Cassandra — это хорошо масштабируемое, в конечном итоге согласованное, распределенное, структурированное хранилище строк/столбцов. Вопросы об администрировании сервера Cassandra можно задать на странице https://dba.stackexchange.com/questions/tagged/cassandra.