2 つのデータベースold
&があります。データベースの詳細をフィルタリング/操作して、に保存する必要があります。new
old
new
OLD DB
約10000の構成(DB行)があります
上記の構成 ID に一致する 10000 BLOB (xml ファイルのサイズは平均で 4 MB)
NEW DB
古いものからフィルタリングされたデータを含む新しいテーブルが 1 つあるが、今回は BLOB データではなく、絶対パスの代わりに
および構成ごとにいくつかの推奨事項
OLD DB
ここで、使用可能なすべての構成レコードを取得してクラスのリストに保存し、DB 接続を閉じるプログラムを (DB に Groovy と MyBatis を使用して) 作成しました。
各構成 ID の BLOB も取得するために、新しい接続が確立され、長時間開いたままになります
List<String> projectid
List<CSMConfigInfo> oldConfigs
List<ConfigInfo> newConfigs
Map<String,CSMConfigInfo> oldConfigMap
SqlSession session = DatabaseConnectivity.getOldCSMDBSessionFactory().openSession()
/* trying to batch execute based on project id */
projectid.each {pid->
logger.info "Initiating conversion for all configuration under $pid project id"
oldConfigMap.each {k,v->
/* Here I am keeping a DB connection open for a long time */
if(pid.equals(v)){
createFromBlob(k,session)
}
}
logger.info "Completed for $pid project id\n"
}
session.close()
BLOB を 1 つずつフェッチした後、一時 xml ファイルを作成し、これを解析して に挿入するためのフィルターを適用しますNEW DB
。以下のコードでは、xml が変換可能で解析可能かどうかに基づいて、新しい接続が開かれていることがわかりますNEW DB
。NEW DB
これは良い習慣ですか、それとも 10000 レコードすべてに対して接続を開いたままにしておく必要がありますか?
/* XML is converted to new format and is parsable */
def createFromBlob(CSMConfigInfo cfg,SqlSession oldCSMSession){
.
.
if(xmlConverted&&xmlParsed){
//DB Entries
try{
/* So now here I am opening a new connection for every old config record, which can be 10000 times too, depending on the filter */
SqlSession sess = DatabaseConnectivity.getNewCSMSessionFactory().openSession()
//New CSM Config
makeDatabaseEntriesForConfiguration(newConfig,sess)
//Fire Rules
fireRules(newConfig,sess,newCSMRoot)
sess.close()
}
catch(IOException e){
logger.info "Exception with ${newConfig.getCfgId().toString()} while making DB entries for CONFIG_INFO"
}
logger.info "Config id: "+cfg.getCfgId().toString()+" completed successfully, took "+getElapsedTime(startTime)+ " time. $newabspath"
}
else{
def errormsg = null
if(!xmlConverted&&!xmlParsed)
errormsg = "Error while CONVERSION & PARSING of config id "+cfg.getCfgId().toString()+", took "+getElapsedTime(startTime)+ " time."
else if(!xmlConverted)
errormsg = "Error while CONVERSION of config id "+cfg.getCfgId().toString()+", took "+getElapsedTime(startTime)+ " time."
else if(!xmlParsed)
errormsg = "Error while PARSING of config id "+cfg.getCfgId().toString()+", took "+getElapsedTime(startTime)+ " time."
logger.info errormsg
}
makeDatabaseEntriesForConvertStatus(csmConfigConvertStatus,oldCSMSession)
}
これは現在 20 レコードで機能しますが、10000 レコードすべてに対してどのように反応するかはわかりません。助けてください
アップデート
設定ごとに約 3 ~ 6 秒かかります