📄 parsev3pmdatafile.java
字号:
saveToRecordOrientedMap(guideLineData);
}// end for
dataCount += measObjCnt;
insertCount += measObjCnt;
}
/***************************************************************
* liuyuan 2008-2-3 CRMCN00003425
* TDR2000新增计数器组42,TDR3000新增计数器组28, 所包含的计数器均为干扰功率的计数器,
* 其处理方式和TDR3000中的22组计数器中的干扰功率相关的计数器处理方式完全一样,参照处理。
**************************************************************/
else if (groupId == 28) {
// log.debug(NewParseV3DataFile.class, new StringBuilder()
// .append("parse pmdata file : 计数器组ID ").append(
// groupId).append("测量对象个数 ").append(
// measObjCnt).toString());
for (int i = 0; i < measObjCnt; i++) {
GuideLineData guideLineData = new GuideLineData();
// add by liuyuan 2007-7-19 增加设置计数器组ID
guideLineData.setCounterGroupId(groupId);
// end by liuyuan
/* dn */
NeMoi nemoi = new NeMoi();
nemoi.setMoc(msgInStream.readInt());
// count = count + 4;
nemoi.setMoi(msgInStream.readBytes(8));
// count = count + 8;
String dn = IimUtil.NeMoitoDn(type, nemoi);
count = count + 12;
// log.debug(ParseV3DataFile.class, new StringBuilder()
// .append("parse pmdata file : dn_").append(i)
// .append(" ").append(dn).toString());
guideLineData.setDn(dn);
readTimeInfo(msgInStream, guideLineData,
endTimeSetInV3Group);
count = count + 8;
List<NameValue> nvs = new ArrayList<NameValue>();
/* 计数器值 */
for (int j = 0; j < counterCnt; j++) {
NameValue nv = new NameValue();
// modify by liuyuan 2007-4-13
// 读取UINT32变量,用readUInt方法,读取为long型
// BUGCN00015892
// nv.setValue(msgInStream.readUInt());
// 干扰功率计算公式,进行转换
nv.setValue(PmUtil.DisturbPowTransform(msgInStream
.readUInt()));
count = count + 4;
nv.setName(names.get(j));
nvs.add(nv);
// log.debug("parse pmdata file : " + nv.getName() +
// " : " + nv.getValue());
}// end for
guideLineData.setNvs(nvs);
/*
* 在解析得到所有数据后再进行入库操作, 为了保证在解析文件中不出现数据错误
*/
// gldata.add(guideLineData);
// dataCount++;
saveToRecordOrientedMap(guideLineData);
}// end for
dataCount += measObjCnt;
insertCount += measObjCnt;
}
/***************************************************************
* end by liuyuan 2008-2-3 CRMCN00003425
**************************************************************/
else {
// log.debug(NewParseV3DataFile.class, new StringBuilder()
// .append("parse pmdata file : 计数器组ID ").append(
// groupId).append("测量对象个数 ").append(
// measObjCnt).toString());
// elapsedTimer.reset("解析计数器组(所有DN)");
for (int i = 0; i < measObjCnt; i++) {
GuideLineData guideLineData = new GuideLineData();
// add by liuyuan 2007-7-19 增加设置计数器组ID
guideLineData.setCounterGroupId(groupId);
// end by liuyuan
/* dn */
NeMoi nemoi = new NeMoi();
nemoi.setMoc(msgInStream.readInt());
// count = count + 4;
nemoi.setMoi(msgInStream.readBytes(8));
// count = count + 8;
String dn = IimUtil.NeMoitoDn(type, nemoi);
count = count + 12;
// log.debug(ParseV3DataFile.class, new StringBuilder()
// .append("parse pmdata file : dn_").append(i)
// .append(" ").append(dn).toString());
guideLineData.setDn(dn);
readTimeInfo(msgInStream, guideLineData,
endTimeSetInV3Group);
count = count + 8;
List<NameValue> nvs = new ArrayList<NameValue>();
/* 计数器值 */
for (int j = 0; j < counterCnt; j++) {
NameValue nv = new NameValue();
// modify by liuyuan 2007-4-13
// 读取UINT32变量,用readUInt方法,读取为long型
// BUGCN00015892
nv.setValue(msgInStream.readUInt());
count = count + 4;
nv.setName(names.get(j));
nvs.add(nv);
// log.debug("parse pmdata file : " + nv.getName() +
// " : " + nv.getValue());
}// end for
guideLineData.setNvs(nvs);
/*
* 在解析得到所有数据后再进行入库操作, 为了保证在解析文件中不出现数据错误
*/
// gldata.add(guideLineData);
saveToRecordOrientedMap(guideLineData);
// dataCount++;
}// end for
dataCount += measObjCnt;
insertCount += measObjCnt;
// elapsedTimer.stop();
}// end else
// log.debug(ParseV3DataFile.class, " parse use time end " +
// System.currentTimeMillis());
/* 一条记录读取完毕 */
if (count == lRecordLen) {
error = error + lRecordLen + 4;
count = 0;
} else {
log.error(ParseV3PMDataFile.class, new StringBuilder()
.append("V3数据文件格式无效,解析失败").append(" count = ")
.append(count).append(" RecordLen = ").append(
lRecordLen).toString());
throw new FileParseException("V3数据文件格式无效,解析失败");
}
// 将该计数器组的结束时间的集合放入Map中
if (v3CounterGroupMap.containsKey(groupId)) {
v3CounterGroupMap.get(groupId).addAll(endTimeSetInV3Group);
} else {
v3CounterGroupMap.put(groupId, endTimeSetInV3Group);
}
/**
* xingyong 2008-11-11 14M的性能数据(参数 300个NodeB 挂3个小区
* 每个小区3个载波),能达到的GuideLineData对象的数目是29704,产生的虚拟GuideLineData数目为8102.
* 虚拟GuideLineData数目可以认为是实际插入数据记录数.
* 虚拟GuideLineData有多条相关的(在同一表且同一记录的)实际GuideLineData组成.
* 所以取10000为强制插入的经验值. 如果该值,可能会导致内存溢出,太小则数据库会产生很多碎片记录.
* 所谓碎片记录是指本来一条数据库记录可以存储的数据,分成了多条记录. 碎片记录会严重影响数据库的查询效率.
* 实际证明1000还是过大. 理想情况是该值计数器组所测量的对象最大数目,也就是载波dn数目 300*3*3 = 2700
*/
if (recordOrientedMap.size() >= 2710) {
log.debug(this.getClass(), "recordOrientedMap已满:"
+ recordOrientedMap.size());
insertDB();
insertCount = 0;
}
// if(insertCount/recordOrientedMap.size() >=3){
// insertDB();
// insertCount = 0;
// }
// log.debug(this.getClass(),"insertCount:"+insertCount);
// log.debug(this.getClass(),"real
// insertCount:"+recordOrientedMap.size());
/* 如果到达文件的末尾 */
if (datain.available() == 0) {
// elapsedTimer.reset("insertDB");
insertDB();
// elapsedTimer.stop();
break;
}
}// end while
// 插入TBL_GUIDE_LINE_DATA_RECENT,以便性能服务器可以判断是否有延迟告警
// elapsedTimer.reset("insertLatecyInfo");
insertLatecyInfo(conn, file, rncId);
// elapsedTimer.stop();
// 提交事务
// elapsedTimer.reset("commit");
conn.commit();
// elapsedTimer.stop();
// long end = System.currentTimeMillis();
// log.info(ParseV3DataFile.class, new StringBuilder().append(
// "parse pmdata file : ").append("数据插入成功_记录个数 ").append(
// dataCount).append(" 入库的时间 ").append(new Date()).toString());
// log.info(ParseV3DataFile.class, "解析文件入库 " + file.getName() + " 耗时
// "
// + (end - begin) / 1000);
closeFile(filein, datain);
filein = null;
datain = null;
/* 删除本地的文件,加入删除队列 */
if (file.exists() && !file.delete()) {
/* 如果删除失败,则加入到队列后,继续删除 */
DeleteFileQueue.getInstance().putDeleteFile(file);
log.error(ParseV3PMDataFile.class, new StringBuilder().append(
"删除本地性能数据文件失败! ").append(file.getAbsoluteFile())
.toString());
} else {
/* 删除成功 */
log.info(ParseV3PMDataFile.class, new StringBuilder().append(
"删除本地性能数据文件成功! ").append(file.getAbsoluteFile())
.toString());
}
} catch (SQLException e) {
log.error(new StringBuilder().append("解析性能数据文件 ").append(
file.getName()).append(",提交入库失败!").append(e.getMessage())
.toString(), e);
try {
conn.rollback();
} catch (SQLException e1) {
log.error(e.getMessage(), e);
}
// 放入解析异常队列,等待下次的解析
// 填入异常记录
fileinfo.setExceptionInfo(new Date(), FileInfo.DB_EXCEPTION);
ParseFileExceptionQueue.getInstance().putParseFile(fileinfo);
} catch (DatabaseException e) {
// add by liuyuan 增加入库操作发生异常时的打印日志
log.error(new StringBuilder().append("解析性能数据文件 ").append(
file.getName()).append(",数据入库发生异常!").append(e.getMessage())
.toString(), e);
try {
conn.rollback();
} catch (SQLException e1) {
log.error(e.getMessage(), e);
}
// 放入解析异常队列,等待下次的解析
// 填入异常记录
fileinfo.setExceptionInfo(new Date(), FileInfo.DB_EXCEPTION);
ParseFileExceptionQueue.getInstance().putParseFile(fileinfo);
} catch (FileNotFoundException e) {
log.error("找不到文件 " + file.getName(), e);
} catch (EOFException ex) {// 在IOException前捕捉,证明是文件格式的问题
closeFile(filein, datain);
// error = error + count + 4;
log.error("解析文件异常: " + file.getName() + " 错误位置: " + error, ex);
File f = new File(PmConst.PM_DIR + File.separator + file.getName()
+ ".bad");
boolean save = file.renameTo(f);
if (save) {
log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
+ " 成功");
} else {
log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
+ " 失败");
}
} catch (IOException e) {
closeFile(filein, datain);
log.error("读取文件异常 " + file.getName(), e);
// 放入解析异常队列,等待下次的解析
// 填入异常记录
fileinfo.setExceptionInfo(new Date(), FileInfo.IO_EXCEPTION);
ParseFileExceptionQueue.getInstance().putParseFile(fileinfo);
}// modify by liuyuan 2008-4-2 CNBUG00016270 加入解析文件时出错信息的定位
catch (FileParseException e) {
closeFile(filein, datain);
// error = error + count + 4;
log.error("解析文件异常: " + file.getName() + " 错误位置: " + error, e);
File f = new File(PmConst.PM_DIR + File.separator + file.getName()
+ ".bad");
boolean save = file.renameTo(f);
if (save) {
log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
+ " 成功");
} else {
log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
+ " 失败");
}
} catch (Exception e) {
closeFile(filein, datain);
error = error + count + 4;
log.error("解析文件异常:" + file.getName() + " 错误位置: " + error, e);
File f = new File(PmConst.PM_DIR + File.separator + file.getName()
+ ".bad");
boolean save = file.renameTo(f);
if (save) {
log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
+ " 成功");
} else {
log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
+ " 失败");
}
} finally {
try {
// 清空缓存
defaultBeginTime = null;
defaultEndTime = null;
tableAndDnMap.clear();
v3CounterGroupMap.clear();
recordOrientedMap.clear();
batchCounter = 0;
// 关闭解析流
closeFile(filein, datain);
if (useDBConnectonPool) {
// conn将保留以后复用
} else {
if (conn != null) {
// 关闭连接时,会自动关闭该连接上的statement
for (PreparedStatement tempP : preparedStatementMap
.values()) {
tempP.close();
}
preparedStatementMap.clear();
conn.close();
}
}
} catch (SQLException e) {
log.error(e.getMessage(), e);
}
// elapsedTimer.stop();
long endTestTime = System.currentTimeMillis();
log.debug(this.getClass(), "解析V3文件性能文件耗时:"
+ (endTestTime - beginTestTime));
busy = false;
}
}
/**
* 入库
*
* @throws DatabaseException
*/
private void insertDB() throws DatabaseException {
try {
// 按照表格记录归类
/*
* Collection<List<GuideLineData>> values =
* recordOrientedMap.values(); for (List<GuideLineData>
* guidLineDataList : values) { insert(conn, guidLineDataList);
* guidLineDataList.clear(); }
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -