Код: Выделить всё
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....
}}
< 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
}}
Проблема, с которой я столкнулся, заключается в том, что я получаю дублирующийся идентификатор заказа, поскольку он вызывается несколькими потоками и тот же идентификатор заказа из таблицы (заказ), читаемой несколькими потоками, и создаю новый идентификатор заказа. добавив его.
поскольку я отметил, что метод синхронизирован, но проблема не решена
я не хочу делать идентификатор заказа уникальным в базе данных, я использую данные mysql base.
если я делаю это без многопоточности, сохранение 500 записей с многопоточностью занимает от 2,5 до 3 минут, а с многопоточностью - 10-12 секунд, но проблема в дублирующемся идентификаторе заказа. >
Чтение 500 данных из CSV-файла с более чем 35 заголовками (столбцами)
Мне нужно решение уровня приложения.
Подробнее здесь: https://stackoverflow.com/questions/786 ... nvironment