私は Drools エンジンを使用していますが、実装側からのみです。フレームワークは私のためにセットアップされており、RULES側のみを使用できます(自分で説明できるといいのですが)。
つまり、私の問題は、約 100 万行を Oracle DB から WM にロードしようとしているということです。このタスクには時間がかかりすぎることがわかりました。オブジェクトをロードするために使用するルールは次のとおりです。実行時にエンジンに挿入される他のオブジェクトとともに、これらの DB オブジェクトをルールの一部として使用する必要があるため、数百万のレコードを WM にロードすることは必須です)。
ルール "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 クアッド コア プロセッサを備えています。
問題は、5000 個の raw をロードするのに約 1 分かかることです --> したがって、DB から 100 万個のレコードをロードしたい場合、タスクを完了するのに 200 分かかり、これは多すぎます。
ここで何か助けていただければ幸いです。
どうもありがとう!