在我的项目中,我们将10000条记录插入数据库表中。我们正在迭代数据库中的每个记录,并将其与插入的记录进行比较。如果有任何更新,我们将更新记录,否则我们将插入数据库。 问题是为什么条件list()方法需要花费一些时间才能从表中获取数据。数据库记录是否在会话中缓存?我们正在使用会话merge()方法插入记录。而且我们将spring和hibernate一起使用。
如果我调用会话刷新和清除方法,则性能得到改善,并且条件list()方法正在以非常快的速度从数据库中获取记录。
为什么我们需要调用会话冲洗和清除方法?我要清除会话中可用的插入记录吗?
请帮助我如何改善此应用程序的性能
Item.java
public class Item{
public void saveCOXItemSalesLocation(CemCOXItemList pCemCOXItemList) {
int i = 1;
COXItemSalesLocationMap allCOXItemSalesLocations = new COXItemSalesLocationMap();
for (CemCOXItem vCemCOXItem : pCemCOXItemList) {
ClassUnitKey classUnitKey = new ClassUnitKey(vCemCOXItem.getClassUnitKey().getClassType(),
vCemCOXItem.getClassUnitKey().getClassUnitType(),
vCemCOXItem.getClassUnitKey().getClassUnitCode());
COXItemKey COXItemKey =
new COXItemKey(vCemCOXItem.getItemNo(), vCemCOXItem.getItemType());
COXItemKeyMap vCOXItemKeyMap = new COXItemKeyMap();
vCOXItemKeyMap.put(COXItemKey);
Set<String> salesLocationNmaeIds = new HashSet<String>();
// fetch existing SalesLocationNames from CEM
System.out.println("sales location name get start" + new DateTime());
COXItemSalesLocationNameMap existingCOXItemSalesLocationNameMap =
getCOXItemSalesLocationNames(classUnitKey, vCemCOXItem);
System.out.println("sales location name get end" + new DateTime());
// fetch existing SalesLocations from CEM
System.out.println("sales location get start" + new DateTime());
List<COXItemSalesLocation> existingCOXItemSalesLocationList =
getNonDeletedCOXItemSalesLocations(classUnitKey, vCOXItemKeyMap);
System.out.println("sales location get end" + new DateTime());
List<COXItemSalesLocation> COXItemSalesLocationList =
new ArrayList<COXItemSalesLocation>();
COXItemSalesLocationNameMap COXItemSalesLocationNameMap =
new COXItemSalesLocationNameMap();
for (CemCOXItemSalesLocation vCemCOXItemSalesLocation : vCemCOXItem
.getCOXItemSalesLocationList()) {
// Map CemCOXItemSalesLocation to COXItemSalesLocation
COXItemSalesLocation COXItemSalesLocation = (COXItemSalesLocation) cemMapper
.map(vCemCOXItemSalesLocation, new COXItemKeyComposite(classUnitKey,
new ItemKey(vCemCOXItem.getItemNo(), vCemCOXItem.getItemType())));
if (!COXItemSalesLocation.getCOXItemSalesLocationAreas().isEmpty()) {
for (COXItemSalesLocationArea COXItemSalesLocationArea : COXItemSalesLocation
.getCOXItemSalesLocationAreas()) {
if (COXItemSalesLocationArea.getCOXItemSalesLocationNames() != null) {
COXItemSalesLocationNameMap.putAll(transformSalesLocationName(
COXItemSalesLocationArea.getCOXItemSalesLocationNames(),
existingCOXItemSalesLocationNameMap));
}
}
}
COXItemSalesLocationList.add(COXItemSalesLocation);
// add sales location names from Saleslocation
if (CollectionUtils.isNotEmpty(COXItemSalesLocation.getCOXItemSalesLocationNames())) {
COXItemSalesLocationNameMap.putAll(
transformSalesLocationName(COXItemSalesLocation.getCOXItemSalesLocationNames(),
existingCOXItemSalesLocationNameMap));
}
}
System.out.println("sales location name save start" + new DateTime());
saveCOXItemSalesLocationName(COXItemSalesLocationNameMap);
System.out.println("sales location name save end" + new DateTime());
for (COXItemSalesLocationName COXItemSalesLocationName : COXItemSalesLocationNameMap) {
salesLocationNmaeIds.add(COXItemSalesLocationName.getId());
}
COXItemSalesLocationMap existingSaleslocationMapFromList =
new COXItemSalesLocationMap();
existingSaleslocationMapFromList.putAll(existingCOXItemSalesLocationList);
// SaveSalesLocations
COXItemSalesLocationMap transformedSalesLocationMap =
mSaveCOXItemSalesLocationTransformer.toCOXItemSalesLocation(
COXItemSalesLocationList, existingSaleslocationMapFromList, classUnitKey,
COXItemKey);
System.out.println("sales location save start" + new DateTime());
saveCOXItemSalesLocation(transformedSalesLocationMap);
System.out.println("sales location save end" + new DateTime());
}
}
COxSalesLocationDao.java
class COxSalesLocationDao{
@SuppressWarnings("unchecked")
public COXItemSalesLocationNameMap getCOXItemSalesLocationNames(ClassUnitKey pClassUnitKey,
CemCOXItem pCemCOXItem) {
if (pClassUnitKey == null) {
return new COXItemSalesLocationNameMap();
}
Criteria vCriteria = getSession().createCriteria(COXItemSalesLocationNameView.class);
ClassUnitKeyFilter vClassUnitKeyFilter = new ClassUnitKeyFilter(pClassUnitKey);
vCriteria.add(this.getClassUnitKeyFilterCriterion(vClassUnitKeyFilter,
"COXItemSalesLocationNameKey.ClassType", "COXItemSalesLocationNameKey.ClassUnitType",
"COXItemSalesLocationNameKey.ClassUnitCode"));
vCriteria.add(getExcludeDeletedEntities("DeleteDateTime"));
if (pCemCOXItem != null) {
Disjunction vDisjunction = Restrictions.disjunction();
CemCOXItemSalesLocationList vCemCOXItemSalesLocationList =
pCemCOXItem.getCOXItemSalesLocationList();
for (CemCOXItemSalesLocation vCemCOXItemSalesLocation : vCemCOXItemSalesLocationList) {
for (CemCOXItemSalesLocationArea vCemCOXItemSalesLocationArea : vCemCOXItemSalesLocation
.getSalesLocationAreaList()) {
for (CemCOXItemSalesLocationName vCemCOXItemSalesLocationName : vCemCOXItemSalesLocationArea
.getSalesLocationAreaNameList()) {
Conjunction vConjuction = Restrictions.conjunction();
vConjuction.add(Restrictions.eq("COXItemSalesLocationNameKey.LanguageCode",
vCemCOXItemSalesLocationName.getLanguageCode()));
vConjuction.add(Restrictions.eq("COXItemSalesLocationNameKey.CountryCode",
vCemCOXItemSalesLocationName.getCountryCode()));
vConjuction.add(Restrictions.eq("COXItemSalesLocationNameKey.Id",
vCemCOXItemSalesLocationName.getId()));
vDisjunction.add(vConjuction);
}
}
}
vCriteria.add(vDisjunction);
}
// IKEA00853945
return new COXItemSalesLocationNameMap(castCOXItemSalesLoctionName(vCriteria.list()));
}
public void saveCOXItemSalesLocation(COXItemSalesLocationMap pCOXItemSalesLocationMap) {
if (ListUtils.isNotNullOrEmpty(pCOXItemSalesLocationMap)) {
for (COXItemSalesLocation vCOXItemSalesLocation : pCOXItemSalesLocationMap
.values()) {
getSession().merge(vCOXItemSalesLocation);
}
getSession().flush();
getSession().clear();
}
}
public void saveCOXItemSalesLocationName(
COXItemSalesLocationNameMap pCOXItemSalesLocationNameMap) {
if (ListUtils.isNotNullOrEmpty(pCOXItemSalesLocationNameMap)) {
saveCOXItemSalesLocationName(pCOXItemSalesLocationNameMap.values());
}
}
private void saveCOXItemSalesLocationName(
Collection<COXItemSalesLocationName> pCOXItemSalesLocationNames) {
if (ListUtils.isNotNullOrEmpty(pCOXItemSalesLocationNames)) {
for (COXItemSalesLocationName vCOXItemSalesLocationName : pCOXItemSalesLocationNames) {
getSession().merge(vCOXItemSalesLocationName);
}
getSession().flush();
getSession().clear();
}
}
@SuppressWarnings("unchecked")
public List<COXItemSalesLocation> getNonDeletedCOXItemSalesLocations(
ClassUnitKey pClassUnitKey, COXItemKeyMap pCOXItemKeyMap) {
if (pClassUnitKey == null) {
return new ArrayList<COXItemSalesLocation>();
}
Criteria vCriteria = createCriteria();
vCriteria.createAlias("COXItemSalesLocationAreas", "COXItemSalesLocationAreas")
.add(Restrictions.isNull("COXItemSalesLocationAreas.DeleteDateTime"));
vCriteria.add(this.getClassUnitKeyFilterCriterion(new ClassUnitKeyFilter(pClassUnitKey),
"COXItemSalesLocationKey.ClassType", "COXItemSalesLocationKey.ClassUnitType",
"COXItemSalesLocationKey.ClassUnitCode"));
Disjunction vDisjunction = Restrictions.disjunction();
for (COXItemKey vCOXItemKey : pCOXItemKeyMap.values()) {
Conjunction vConjunction = Restrictions.conjunction();
vConjunction
.add(Restrictions.eq("COXItemSalesLocationKey.ItemNo", vCOXItemKey.getItemNo()));
vConjunction.add(
Restrictions.eq("COXItemSalesLocationKey.ItemType", vCOXItemKey.getItemType()));
vDisjunction.add(vConjunction);
}
vCriteria.add(getExcludeDeletedEntities("DeleteDateTime"));
vCriteria.add(vDisjunction);
return vCriteria.list();
}
}