使用DBCopier進行不同數據庫間的數據移植
DBCopier同樣是在多數據庫環境中,?了適應數據整理和拷貝而開發的可重用構件。不過,實際上,更多的情況是用在不同的開發過程中由于表結構的修改,而需要對曆史數據進行整理歸一的過程。
DBCopier的工作核心是mission.xml,每一個mission是一個拷貝任務;不同的數據庫連接在connectionset元素中定義,實際上,這與ConnextionManger和DAO中的定義和解釋是一樣的。
如:
abcd" />
定義了若幹個數據庫連接定義。根據需要,DBCopier可以把不同的數據庫中的表拷貝到另一個數庫的某個或幾個表上,也可以在同一個數據庫中拷貝。
每一個mission是一個任務:
詳細定義是:
mission代表一?拷?任?;
mission.(target/source) 分?表明拷?的目?和?源,?构是(?据源.表名),意?是直接??表操作,?管主要由Query????,或者是Clazz,但是在?算步?和?量?仍需要?里的表名。反而是target可以直接?据源名?。
mission.index 指示是以什么域作?拷???的指?,如id;
mission.range;采用1-2000??的形式,前者是起始,后是??(?照index);如果是“*”,表示全部拷?(默?)。
mission.step:步?,即每次?作?程拷?多少,??相?于?置??大小;每次?行step的?目,或????(小于step?)
mission.condition是拷??象的附加?件;可以直接?作cdata形式;
mission.query元素: 每?mission目前可以定?多?Query?象,但至少包括分?命名?write的Query?象,如果?有mission.clazz作??入源, ?必?有一?名?read的Query?象;特?注意read?象,如果其中有"WHERE"一定要大?,特?是在condition有?西的?侯;$ {MIN}/${MAX}是程序?定的大值和小值??,与range配合,即使是“*”,???值也是必?的;因?步???的?侯需要???值
注意:query.sql中如果有域是long/clob型的,一定要?在最前面,否?可能出?;
mission.clazz元素:{
?于一些复??构的?据?象?型,很?确定?一?表?表的抄?,同?也?包含有多?的互相?束,??侯需要使用?据?象作??据源;即每一??象?例是相 ?于一行主表的??,它的?性是各?基表或子表值;clazz?象tools.xmlobj.Clazz必???tools.COPIER接口,并用?准 的setter/getter取/置值;
clazz.attribute?象;主要包括三??性,name,value,和type,type用于反射?的class型?得,因此要求完全的名?,以便在程序中Class.forName();
}
mission.field;{
DBCopier??上是使用Query.write中的?量?得一?串,然后通???串?索qread或者是cread形成一?名值?填充好一?完整的 sql,最后?行??batchsql完成移植的目的。每??量串中的域?得值的方式各不相同,特?是在?多情?下?移的?程本身就是?原?不合理的?据 ??方式的重整,(?范化或非?范化),filed就是????需求?行?置。如果?有相?的field?置,?采用默??置,即名?相同且都是字符串 值;field的??是首先采?value值,然后按query取值,最后按常?取值;
field.name:?名??与qwrite中的?量名?之一匹配;否?DBCopier?加以忽略;
field.sname:?名?指老表中的域名?,DBCopier通????cread或qread的rs中??据;默?地与field.name相同;
field.stype:?入的?型,???于使用qread特?重要,尤其?于date?型;
field.ttype:?出的?型,是指插入的?型,主要是因?生成sql?字符串需要使用‘’括起?;
filed.value: value是?定的值;可用此直接?一行?值;如果是“system.time”,意思是取System.currentTimeMillis()的值;
field.query:{
如果?域必???特?的查?得到值,就?定所用的query名?,??query??已?定?在同一?mission中。
field.query??上??了???程,一是以前述的方法?得一?指定的?量;代入query的sql?定,?行??sql再?取它的值;
??field的域含?有重大的修改:
field.sname指代入field.query.sql中的?量名?,一定要与相?的?据?接中的表.域名?相同;
field.stype指???query?果?的?型;其余意思一?。
field.filter; 如果??域在存入新?中?需要??更替其中的一些字符串,?置好filter后用?????用。
}
注意:query的connetion查?到底是那一?的,常常是??的?系;
}
mission.filter,用于????程中的字符串列?行必要的字符替?和??;由field?用;
在定義好後,執行:
java DBCopier mission=xxxx;;
程序就會按照步長一段一段地完成數據移植任務,不滿意就重新來一遍。之所以要分割步長,是為了避免多個連接游標在大數據表時溢出出錯。