Как я могу разделить память между двумя веб-сервисами Java? - PullRequest
1 голос
/ 22 ноября 2011

Я получил две веб-службы Java, размещенные в Tomcat на одном сервере.

Есть ли способ разделить память (объекты) между ними?

Я могу превратить разделение в какие-то вызовы веб-методов, однако

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

Ответы [ 5 ]

5 голосов
/ 22 ноября 2011

Не то, что я знаю.Похоже, это чревато опасностью.Сложно синхронизировать объекты в одном приложении;у вас нет надежды с двумя.Что хорошего это может сделать?

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

2 голосов
/ 22 ноября 2011

Есть ли способ разделить память (объекты) между ними?

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

Но вы не можете поместить объекты Java в эту область.JVM не поддерживает это ни в коде Java, ни в собственном коде.(И даже если бы вы могли, синхронизация была бы большой проблемой.)


Так что может использовать общую память для обмена данными между двумя JVM?

Может быть,Но вам нужно будет рассматривать сегмент разделяемой памяти как своего рода базу данных и реализовывать схему для копирования состояния объекта между сегментом и кучей каждой JVM.И вам необходимо реализовать надежную схему синхронизации, возможно, с использованием семафоров.

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

1 голос
/ 01 октября 2013

Попробуйте использовать JCS:

http://commons.apache.org/proper/commons-jcs/

Надеюсь, это поможет!;)

0 голосов
/ 27 февраля 2017

Как насчет использования общей библиотеки.

Вы можете реорганизовать свою логику, переместить их в отдельную библиотеку и собрать как отдельный jar.

Файл jar должен находиться в каталоге tomcat_home / lib .И в ваших веб-приложениях библиотечная зависимость должна быть установлена ​​как при условии (в maven)

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

0 голосов
/ 22 ноября 2011

На межпроцессных коммуникациях Java говорит:

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

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

Это говорится, вернемся к практике. Скажем, например, у вас есть набор объектов {a,b,c}, которыми вы хотите поделиться между своими службами. Создайте класс хранилища данных, содержащий объекты {a,b,c}, и всякий раз, когда происходит обновление, делайте это в хранилище данных dataStore.setA(A new_a). За сценой и при каждом обновлении локальное хранилище данных уведомляет удаленное хранилище данных, находящееся в другом приложении, и передает все только что сделанные обновления. Следующее DTO может использоваться для передачи всех изменений из одного хранилища данных в другое:

public class ObjectUpdateEvent<Source> implements Serializable {
    private String fieldName;
    private Object previousValue;
    private Object newValue;
    private Source source;
    // Constructor...
}

Обновление объекта "а" может быть выполнено следующим образом

public class DataStore{
    // .....

    public setA(A new_a){
      ObjectUpdateEvent<DataStore> updateDto = new ObjectUpdateEvent<DataStore>();
      updateDto.setPreviousValue(a);
      updateDto.setNewValue(new_a);
      sendUpdateDto();
      a = new_a;
    }
}

РЕДАКТИРОВАТЬ: Это именно то, что @duffymo упомянул выше.

...