【发布时间】:2017-07-08 14:05:54
【问题描述】:
我有一个包含 100 000 条记录的 csv 数据文件。我正在遍历记录并尝试为每条记录更新 5 个表。这是示例数据:
EAN Code,Site,Genric Material,Material,Sap Ean Code,Style,Color,Size,MRP,Gender,EAN Code,Season,Collection,BRAND,Color revision,Category (L5),Category (L6)
123456789,6001,000000000061000102,000000061000102001,61000102001,03/BE100,SC/TG,L/112 cm,850.00,MENS,123456789,AW12,Colors,XXXXXX,RD/TG,Tee Shirt,Graphic
每次迭代都会更新的五个表如下:
- 大师
- 主描述
- 属性
- 属性值
- 关联表
上述表之间的关系如下:
掌握 M-M AttributeValues
Master M-1 MatserDescription
掌握 M-M 属性
属性 1-M AttributeValues
这是我必须使用批处理技术在单个会话中将 CSV 数据保存到 5 个表中的代码:
服务类
@Service
public class EanService{
@AutoWired
public EanRepository eanrepository;
// Method that saves data from CSV to DataBase
@Transactional
public void saveEANMasterData1(BufferedReader br, String userName,
List<EanAttributes> attributes, String eanMasterName,String description) {
int i =1;
EanMasterDiscription eanDes = new EanMasterDiscription();
User user = userRepository.findUserByUsername(userName);
EanMasterDiscription deciption = null;
eanDes.setDescription(description);
eanDes.setMasterName(eanMasterName);
eanDes.setDate(new Timestamp(Calendar.getInstance()
.getTimeInMillis()));
String line;
try {
List<Ean> eans = new ArrayList<Ean>();
// iterating over each record in the CSV and saving the data into DB
while (((line = br.readLine()) != null)) {
String[] cols = line.split(",");
// Style Keeping Unit
Ean ean = new Ean();
for(EanAttributes attr : attributes){
EanAttributeValues eanAttributeValues = new EanAttributeValues();
if(attr.getAttrInferredType().equalsIgnoreCase("EAN")){
ean.setEAN(cols[attr.getAttributeOrder()]);
}else if(attr.getAttrInferredType().equalsIgnoreCase("Season")){
ean.setSeason(cols[attr.getAttributeOrder()]);
}else {
if(attr.getAttrInferredType().equalsIgnoreCase("Attribute")){
EanAttributes eanAttr = eanrepository.loadAttrsListByAttName(attr.getAttributeName());
if(eanAttr == null){
eanAttributeValues.setAttributeValue(cols[attr.getAttributeOrder()]);
eanAttributeValues.setEanAttributes(attr);
ean.getEanAttributeValues().add(eanAttributeValues);
ean.getEanAttributes().add(attr);
attr.getEan().add(ean);
}else{
ean.getEanAttributes().add(eanAttr);
eanAttr.getEan().add(ean);
if(eanrepository.isAttributeValueAvailable(cols[attr.getAttributeOrder()])){
eanAttributeValues.setAttributeValue(cols[attr.getAttributeOrder()]);
eanAttributeValues.setEanAttributes(eanAttr);
ean.getEanAttributeValues().add(eanAttributeValues);
}else{
EanAttributeValues values = eanrepository.loadDataByAttrValue(cols[attr.getAttributeOrder()]);
ean.getEanAttributeValues().add(values);
values.getEan().add(ean);
}
}
eanAttributeValues.getEan().add(ean);
}
}
}
if(!eanrepository.isEanMasterNameAvailable(eanMasterName)){
EanMasterDiscription eanMasterDes = eanrepository.loadDataByMasterName(eanMasterName);
ean.setEanMasterDesciption(eanMasterDes);
}else{
ean.setEanMasterDesciption(eanDes);
}
ean.setUser(user);
if(eanrepository.isEanWithSeasonAvailable(ean.getEAN(),ean.getSeason())){
// Persisting Ean; I think there is some problem with this method
eanrepository.saveEanData(ean,i);
}else{
System.out.println("************ EAN ALREADY EXIST ******************** ");
}
i++;
}
} catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
}
}
存储库类
@Repository
public class EanRepository{
@PersistanceContext
EntityManager em;
public void saveEanData(Ean ean , int recordNum){
em.merge(ean);
if(recordNum % 50 == 0){
em.flush();
em.clear();
// em.getEntityManagerFactory().getCache().evictAll();
}
}
}
但这需要太多时间(将近 10 小时)才能完成保存所有 100 000 条记录。我们怎样才能减少时间和我错过了什么?
【问题讨论】:
标签: java spring hibernate jpa orm