我正在使用 Drools 引擎,但仅限于实施方面。框架是为我设置的,我只能使用规则方面(我希望我能够解释自己)。
那就是说-我的问题是我正在尝试将大约 100 万行从 Oracle DB 加载到 WM 中,并且我发现此任务花费的时间太长,这是我用来加载对象的规则:(顺便说一句 - 请求将百万记录加载到 WM 中是强制性的,因为我需要使用这些 DB 对象作为我的规则的一部分以及在运行时注入引擎的其他对象)
规则“Load_CMMObject”显着性 10 无循环
when
not CMMObjectShouldBeRefreshed() over window:time( 1500m )
then
log("Fetching Load_CMMObject");
ExecutionContext ctx = getExecutionContext();
String getObjectTypeSQL = "select AID , BC_OBJECT_ID , ALR_EQP_NAME , ALR_FROM_SITE from CMM_DB.COR_EQP_VW";
PreparedStatement pStmt = null;
try {
pStmt = MTServiceAccessor.getDBAccessService().prepareNativeStatement(ctx, getObjectTypeSQL, false);
ResultSet rs = pStmt.executeQuery();
while (rs.next()) {
String aid = rs.getString(1);
int objectID = rs.getInt(2);
String eqpName = rs.getString(3);
String fromSite = rs.getString(4);
CMMObject cmmObject = new CMMObject();
cmmObject.setIp(aid);
cmmObject.setObjectID(objectID);
cmmObject.setEqpName(eqpName);
cmmObject.setFromSite(fromSite);
insert(cmmObject);
//log("insert Object ---> " + cmmObject.getIp());
}
log("Finish Loading All cmm_db.BCMED_EQP_VW");
} catch (Exception e) {
log("Failed to Load ServiceName_TBL" + e);
} finally {
if (pStmt != null) {
try {
pStmt.close();
} catch (Exception e) {
log("Failed to close pstmt");
}
}
}
//log(" finished loading trails into the WM1");
CMMObjectShouldBeRefreshed cMMObjectShouldBeRefreshed = new CMMObjectShouldBeRefreshed();
//log(" finished loading trails into the WM2");
insert (cMMObjectShouldBeRefreshed);
//log("finished loading trails into the WM3");
结尾
我正在使用为 Drools 引擎分配大约 20Gb RAM 的服务器,它有 8 个 1.5GHZ 四核处理器。
问题是我大约需要 1 分钟才能加载 5000 个原始数据 -> 所以如果我想从数据库加载 100 万条记录,我需要 200 分钟才能完成任务,这太多了。
我会很感激这里的任何帮助,
多谢!