2015-10-16 3 views
0

У нас есть веб-сервис Java SOAP, который вызывается клиентским приложением. Службе необходимо разобрать сообщение -> проверить его и отправить подтверждение клиенту. С другой стороны, должен быть вызван другой компонент, который будет выполнять транзакцию базы данных. Я думаю использовать интерфейс java.lang.Runnable как часть компонента обработки, который будет выполнять транзакцию БД асинхронно. Тем временем подтверждение было бы отправлено клиенту. Ниже приведен тестовый код, который я написал. Можете ли вы сказать, будут ли возникать какие-либо проблемы в случае появления нескольких запросов от клиента или следует добавить синхронизацию в блок кода для вызова БД.Асинхронный вызов компонента из Java webservice

public class MessageProcessing implements Runnable{ 

private String inputMsg; 

public MessageProcessing(String sampleMessage) { 
    this.inputMsg = sampleMessage; 
} 

public void sendToSocket() { 

    performDBCall(); 
} 
private void performDBCall() { 
    //TODO Code for DB Call 
} 

@Override 
public void run() { 
    System.out.println("Inside Child Thread"); 
    sendToSocket(); 
} 
+0

Каждый запрос от клиента запустит новый поток MessageProcessing? Теперь он не является потокобезопасным, но синхронизация 'performDBCall()' сама по себе не будет иметь никакого значения здесь, вам нужно подумать и иметь надлежащий объект блокировки для блокировки. До этого вам нужно решить, какие операции с БД вы делаете, и действительно ли они должны быть синхронизированы. –

+0

@RP да каждый запрос от клиента запустит новый поток MessageProcessing. – Saurav

+0

Затем, какие операции с БД вы делаете? Если они чувствительны к потоку, вам необходимо иметь отдельный совместно используемый объект монитора и синхронизировать его с этим объектом. Следующая ссылка предоставит вам некоторую идею. Http://www.tutorialspoint.com/java/java_thread_synchronization.htm –

ответ

0

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

+0

Упоминайте, почему это огромная горловина производительности ** особенно ** в архитектуре клиент-сервер? – Kayaman

+0

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

+0

Непротиворечивая синхронизация выполняется быстро, вы, очевидно, не хотите, чтобы общий критический ресурс страдал от конфликтов потоков. Однако ваш ответ не дает никакой информации. Я не буду спускать вниз, но вы слишком много обобщаете. – Kayaman