Стратегии для Java ORM с ненадежной сетью и низкой полосой пропускания

StackOverflow https://stackoverflow.com/questions/5845163

Вопрос

Я смотрю на Hibernate для системы, которая должна работать в ненадежной сети. Существует одна центральная база данных, к которой нам нужен доступ с чтением-записи, но она доступна в довольно неоднозначной сети Wi-Fi. Кроме того, могут быть потери мощности, которые не выключают применение чисто, поэтому любое решение должно иметь постоянный кэш, который может пережить циклы электроэнергии. Наконец, это встроенная система с лишь скромной памятью, и дисковое пространство, например, сделать полную репликацию базы данных, не является возможной стратегией.

У меня есть базовое понимание кэширования 2 -го уровня Hibernate 2 -го уровня, и мне интересно, можно ли настроить это с чем -то вроде ehcache, чтобы решить эту проблему, но основной задачей, кажется, является производительность, не доступная, поэтому я не знаю какими могут быть подводные камни.

Я также вполне готов рассмотреть другие стратегии, которые включают репликацию в локальную базу данных. Я бы предпочел не делать слишком много тяжелой подъемы, чтобы реализовать это.

Ищу некоторый опыт или возможные альтернативы.

Это было полезно?

Решение 6

Репликатор нарциссов (http://enterprise.replicator.daffodilsw.com/index.html) допускает репликацию между источниками JDBC. Он поддерживает двунаправленные обновления, слияние и разрешение конфликтов и частичные реплики.

Это может быть использовано для синхронизации основной базы данных с локальной (частичной) репликой. Вы можете использовать Hibernate, чтобы поговорить с базой данных локальной реплики и сделать все остальное за пределами этого процесса.

Другие советы

«Кроме того, могут быть потери мощности, которые не выключают применение чисто, поэтому любое решение должно иметь постоянный кэш, который может пережить циклы сил».

У вас уже есть решение с кешем Hibernate Level 2. Но вы не сказали, каковы реальные требования. У вас нереаливая сеть. Это нормально, у вас есть нереальный источник питания. Тоже норм. Теперь какой уровень обслуживания вы хотите достичь? Что приемлемо или нет?

Допустима ли потеря данных? Сколько вы могли бы принять? Какой риск вы принимаете?

Чтобы быть более явным, скажем, у вас есть локальная копия базы данных или, по крайней мере, ее часть. Давайте скажем, что вы знаете, как очередь/сохранить модификацию, сделанные локально. Допустим, вы храните эти модификации на жесткой стороне, чтобы быть в безопасности в случае сбоя энергии. Скажем, вы можете объединить изменения с основной базой данных, когда соединение снова Abaialable.

Это уже много предположений. ОК, но что произойдет, если один жесткий потерей после удара после мощности? Вы знаете, что Harddrive не любит сбой мощности и, как правило, поврежден при сбое мощности или даже может быть поврежден?

Таким образом, вы наносите рейд и добавляете бесперебойный источник питания. Это мило. Ваше событие обнаружения сбоя питания из ОС. Завершите свою текущую транзакцию и правильно выключите. Вы совершаете набег на защиту от неудачи диска.

Хорошо, но что произойдет, если весь компьютер прекратит функционировать? Что происходит в случае огня? Или повреждение воды? Весь диск будет управляться, не взыскание данных и то, что не синхронизируется с центральной базой данных, потеряно. Это приемлемо или нет?

Даже когда Wi -Fi включен, источник питания работает отлично ... какова надежность центральной базы данных? У вас есть регулярные резервные копии? Или решение кластеризации? Вы уверены, что ваша центральная база данных в любом случае надежна?

С точки зрения базы данных легко использовать кластер или резервное копирование и использовать транзакции для обеспечения данных. Вы все еще можете потерять данные (если не использовать кластер в частности), но вы сможете восстановить до последней резервной копии для Exemple.

Но если вы хотите работать в автономном режиме (с недоступной базой данных), и вы не единственный, кто может изменить базу данных, возникает конфликты. Это больше не кеш, спящий режим или что -либо техническая проблема.

Это функциональная проблема. Что делать, когда несколько модификаций происходит в автономном режиме, и вам нужно слиться? Что приемлемо? Что не является. Это может случиться так, что при повторном подключении самые последние изменения применяются, более старые изменения отбрасываются. Или Ptential Conflicts обнаруживаются и побуждают пользователя справиться с ними. Вы можете попытаться применить изменение в очереди и применить их все ...

Я хотел бы считать, что вы можете предложить «автономный режим», но ваши пользователи должны знать, что они офлайн, и должны иметь уведомление, когда изменение вносится постоянным в центральной базе данных с возможным разрешением конфликтов. Но эта моя точка зрения.

Вы не можете ожидать успеха с такой сетью между Hibernate и базой данных.

Я рекомендую вам определить набор высокоуровневых атомных операций, а затем определить набор (например) RESFFUL Services для них. Или, если хотите, вы можете использовать мыло и посмотреть на варианты WS-* для надежных сообщений, чтобы позаботиться о повторных и всех других грязных деталях.

Или вы можете выяснить, будет ли что -то вроде Cassandra по всей ссылке работать лучше, чем SQL, или что -то другое, чтобы репликация.

Как насчет очереди на операции БД в прочной/постоянной очереди сообщения, и позволить некоторому промежуточному программному обеспечению, чтобы решить проблему сети?

В зависимости от того, как вы это делаете, проблемы с согласованностью (ну, «аномалия» - это правильное слово), я думаю, может возникнуть), но если у вас ненадежная сеть и все еще хотите достойную производительность, то согласие на расслабленную последовательность может быть способом.

Я бы не решался использовать ehcache и т. Д. Они не были предназначены для этого, и, следовательно, вам, возможно, придется «растянуть» структуру. С другой стороны, в очереди сообщения есть решения, которые были разработаны для таких сценариев.

Если бы это был просто случай спорадической связи между двумя машинами, я бы порекомендовал сохранить журнал транзакций, который можно воспроизвести, и каждая запись отмечена как обработанная. Однако ограниченная память может затруднить это.

Может быть, вы можете сохранить сжатый журнал транзакции.

Спезок (и кэш второго уровня) В самом деле не предназначен для этого. Я предполагаю, что вам, вероятно, лучше всего использовать небольшие встроенные Java RDBM (например, H2 или HSQLDB) в качестве локальной временной очереди (в наиболее долговечном режиме), а затем сделайте синхронизацию с фоновым потоком. Затем вы можете предоставить интерфейс Sync Spinner, подключенный к этому фоному потоку, чтобы обеспечить некоторую степень обратной связи для пользователя.

Между прочим, Hibernate немного жир, чтобы сбрасывать в встроенную среду. Вместо этого вы захотите рассмотреть Mybatis.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top