#hibernate #jpa #concurrency #playframework
#переход в спящий режим #jpa #параллелизм #playframework
Вопрос:
Предположим, у меня простая модель
package models;
import javax.persistence.Entity;
import play.db.jpa.Model;
@Entity
public class Chart extends Model {
public String name;
@Lob
public String json;
}
Теперь, если бы я должен был извлечь объект из класса Chart в методе следующим образом
Chart c = Chart.findById(1L);
doSomethingWithChartAndLetMeKnow(c)
c.wait();
Теперь в этом методе doSomethingWithChartAndLetMeKnow, как только я закончу обработку, я могу вызвать c.notifyAll() и, предположительно, исходный метод продолжит выполнение.
Однако, что, если совершенно другой метод выполняет следующее
Chart c = Chart.findById(1L);
c.notifyAll();
будет ли вообще запущен исходный поток, ожидавший метода doSomethingWithChartAndLetMeKnow?
Ответ №1:
Нет, это не привело бы к запуску исходного потока.
Два запроса обрабатываются отдельными сеансами. Объекты, извлеченные в разных сеансах, не являются одним и тем же объектом Java.
Однако вам следует проверить поддержку асинхронности Play! вместо использования notify() и wait ():http://www.playframework.org/documentation/1.2/asynchronous
Комментарии:
1. Является ли это гарантией того, что объект, извлеченный в разных сеансах, является разными объектами Java? Или это то, что обычно происходит?
Ответ №2:
Я думаю, что это неправильно:
Теперь в этом методе doSomethingWithChartAndLetMeKnow, как только я закончу обработку, я могу вызвать c.notifyAll() и, предположительно, исходный метод продолжит выполнение.
поскольку вы бы вызывали notify перед ожиданием. Как только он переходит в режим ожидания при вызове метода, он будет ждать другого уведомления.
Тем не менее, я бы не рекомендовал использовать потоки в любом веб-приложении таким образом. Проверьте Akka или какую-нибудь библиотеку Actor-model. Это упростит задачу.