Совместное использование Java синхронизировало блок через кластер или использование глобальной блокировки?

Используйте

g++ test.cpp

вместо этого, так как это - код C++.

<час>

Или, если Вы действительно хотите использовать gcc, добавляют -lstdc++ к командной строке, как так:

gcc test.cpp -lstdc++

Выполнение md5 против эти a.out произведенный согласно каждому сценарию показывает, что это - тот же вывод.

, Но, да, g++, вероятно, делает Ваш мир более простым местом.

16
задан Amro 2 July 2012 в 07:02
поделиться

4 ответа

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

Правильный способ решения этой проблемы - блокировки на уровне базы данных. Предположительно у вас есть таблица, содержащая версию схемы db, поэтому вам следует убедиться, что эта таблица заблокирована на время процесса запуска / обновления.

Точные задействованные вызовы sql / db, вероятно, будут более ясными, если вы укажете свой тип базы данных (DB2?) и метод доступа (необработанный sql, jpa и т. д.).

Обновление (8/4/2009, 14:39) : я предлагаю оператор LOCK TABLE для некоторых таблица, содержащая номер версии схемы.

5
ответ дан 30 November 2019 в 22:24
поделиться

Да, вы правы в том, что синхронизированные блоки не будут работать в кластере. Причина в том, как вы указали, что каждый узел имеет свою собственную JVM.

Однако есть способы заставить синхронизированные блоки работать в кластере, как они будут работать в среде с одним узлом. Самый простой способ - использовать такой продукт, как Terracotta , который будет обрабатывать координацию потоков между разными JVM, чтобы в кластере можно было использовать обычные элементы управления параллелизмом. Есть много статей, объясняющих, как это работает, например Введение в OpenTerracotta .

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

7
ответ дан 30 November 2019 в 22:24
поделиться

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

Мы делаем нечто подобное с нашей базой данных. Это достигается путем добавления в таблицу управления версиями записей. Вот что вам нужно сделать:

  1. Добавить столбец для версии записи / строки.
  2. Пройдите логику, чтобы проверить, нужно ли обновлять запись.
  3. При обновлении записи убедитесь, что версия записи в БД то же самое, что и у вас.
  4. Увеличивайте версию каждый раз, когда вы пишете в базу данных.

У вас должен быть только один сервер, обновляющий базу данных, если вы следуете этим правилам.

3
ответ дан 30 November 2019 в 22:24
поделиться

Не могли бы вы просто заблокировать таблицу (или всю базу данных) для обновлений, чтобы, когда первый узел получил блокировку, все остальные узлы не могли бы писать. Последующие узлы будут ждать, и когда блокировка будет снята, код будет обновлен, поэтому обновление записи не потребуется.

0
ответ дан 30 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: