Повторное создание OrderId в многопоточной средеJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Повторное создание OrderId в многопоточной среде

Сообщение Anonymous »

код:

Код: Выделить всё

  List processFutures = new ArrayList();
for (BulkOrderData readData : bulkOrderDataList) {

processFutures.add(processExcutorService.submit(() -> {

try {
PushOrderDataResponse placeOrderResponse=bulkPushOrderTransactionalService.pushOrderData(readData, productRefMap.get(readData.getItemData().get(0).getProductReference()), countryCode);
readData.setOrderId(placeOrderResponse.getOrderId() != null ? String.valueOf(placeOrderResponse.getOrderId()) : "NA");
readData.setUploadRemark(placeOrderResponse.getMessage());
// return null;

}
catch (Exception e)
{

readData.setOrderId(null);
readData.setUploadRemark("Error we got during placing this order, Please connect to technical team");

logger.error("Error we got during push order in databse",e);

}
return null;

}));
//code....
}}
это код, показывающий, откуда я вызываю свой метод pushOrderData(//argument) в отдельном классе, поскольку этот метод вызывается несколькими потоками.
< pre class="lang-java Prettyprint-override">

Код: Выделить всё

//data saving class

@Service
public class BulkPushOrderTransactionalService {

//method for saving
@Transactional(rollbackFor = Exception.class )
public synchronized PushOrderDataResponse  pushOrderData(BulkOrderData orderData, CassandraApiResponseReader cassandraApiResponseReader, String countryCode) throws Exception {

int startOrderId = 100001;
Integer resMaxOrderIdRes=0;
try {
resMaxOrderIdRes = orderRepository.findOrderIdByOrderSource();
//resMaxOrderIdRes = generateOrderId();

}
catch (Exception e)
{

throw new RuntimeException("Transaction failed in saving ", e);

}

if(resMaxOrderIdRes!=null && resMaxOrderIdRes!=0)
{
startOrderId=resMaxOrderIdRes;

}

//new order id created by getting max order id firstly

newOrderId=startOrderId+1;

CustomerOrderDao customerOrderDao=new CustomerOrderDao();
customerOrderDao.setOrderId(newOrderId);

//more data setting

///saving data corrosponding to new order id

try{
orderRepository.save(customerOrderDao);
//orderDataService.sa
// veOrder(customerOrderDao);

}
catch (Exception e)
{

e.printStackTrace();
logger.error("error in saving data in customer order table{}", e);
response.setCode(404);
response.setMessage("Error we got during placing this order, Please connect to technical team");
response.setStatus("error");
throw new RuntimeException("Transaction failed in saving customer item history", e);

}

// 4 more dao call where i am saving data

}}
Как вы видите в коде, я пытаюсь сохранить данные в базе данных, а размер данных составляет 500, и я вызываю этот метод push, который сохраняет данные в базу данных из многопоточной среды, поэтому внутри метода push сначала я получаю максимальный идентификатор заказа (скажем, из таблицы заказов), затем добавляю его к нему, чтобы создать новый идентификатор заказа, и сохраняю данные в базе данных для этого нового идентификатора заказа (скажем, сначала в таблице заказов, откуда я получаю максимальный идентификатор заказа) и сохраняю данные в 4 Еще 5 других таблиц.
Проблема, с которой я столкнулся, заключается в том, что я получаю дублирующийся идентификатор заказа, поскольку он вызывается несколькими потоками и тот же идентификатор заказа из таблицы (заказ), читаемой несколькими потоками, и создаю новый идентификатор заказа. добавив его.
поскольку я отметил, что метод синхронизирован, но проблема не решена
я не хочу делать идентификатор заказа уникальным в базе данных, я использую данные mysql base.
если я делаю это без многопоточности, сохранение 500 записей с многопоточностью занимает от 2,5 до 3 минут, а с многопоточностью - 10-12 секунд, но проблема в дублирующемся идентификаторе заказа. >
Чтение 500 данных из CSV-файла с более чем 35 заголовками (столбцами)
Мне нужно решение уровня приложения.

Подробнее здесь: https://stackoverflow.com/questions/786 ... nvironment
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница в C++ VS2010 между «Многопоточной DLL» и «Многопоточной»
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Log4j java — динамическое создание регистратора в многопоточной среде
    Anonymous » » в форуме JAVA
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Обратные вызовы reqColmpletedOrder Объект заказа с orderId = 0 и clientId = 0
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Массив PHP: orderID с несколькими идентификаторами orderdetailID
    Anonymous » » в форуме Php
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Погребение ORDERID обнаружила ошибку в MongoDB
    Anonymous » » в форуме Javascript
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»