The original synchronization service is normal, due to the need, the other Side single table new fields, more than 22
SBT Assembly Compilation Error
Too many elements for tuple:26, allowed:22
Scala case class supports a maximum of 22 construction parameters
And find a way out.
Https://underscore.io/blog/posts/2016/10/11/twenty-two.html
https://github.com/slick/slick/issues/519#issuecomment-48327043
Https://github.com/underscoreio/slickless/issues/16
Final Application Slickless Solution
Some examples
ImportSlick.jdbc.H2Profile.api._ImportShapeless. {Hlist,::,Hnil,Generic}ImportSlickless._CaseClassUser (Id:Long,EmailString)ClassUsers (TagTAG)Extendstable[User] (tag,The Users") {DefId= column[Long] ( "id", O.PrimaryKey, o.AutoInc) def email = column[ String] ("email") def * = (ID :: Email :: hnil). Mappedwith (generic[ User])}lazy val users = tablequery[users]
Conversion based on tupled required
Case (byoffset_get,lastid:int) + = {println ("Sync Start by", LastID) val words = Tablequery[words]// Val Action=origin_db.run (Word.filter (_.id > LastID). Take (page_size). Result) Val Action=origin_db.run (words.f Ilter (_.id > LastID). Take (page_size). Result) Action.oncomplete (data=>{println ("Sync get Data", Data.get. Length) if (data.issuccess) {val Words=data.get.tolist.map (a=>{word.tupled (A)}) if (words.length>0) {future {println (S "Blocking next page 1s start") time Unit.SECONDS.sleep (1) println (S "Blocking next page 1s finished")//sync only consider insert if ( Is_just_insert) {Self! ( Byoffset_insert,words)}else{//If historical data is updated self! ( byoffset_insert_update,words)}}}else{//Get the latest data wait 5 minutes future { PrinTLN (S "Blocking future 5m Start") TimeUnit.MINUTES.sleep (5) println (S "Blocking the future 5m finished ") Self! (Byoffset_get,lastid)} }}else{
Future {
println (S "Blocking table" +tablename+ "future 5m start")
TimeUnit.MINUTES.sleep (5)
println (S "Blocking table" +tablename+ "future 5m finished")
Self! ( Byoffset_get,lastid)
}
}
}) } //Insert Data Case (Byoffset_insert,words:list[word]) =>{ println ("Insert Start", words.length) val word = tablequery[words] word.++= (words.map (a=>{ word.unapply (a). Get })) //word.+= ( Word.unapply (Words.head). Get) val insertactions = dbio.seq ( word.++= (Words.map (a=>{ Word.unapply (a). Get })) Dest_db.run (insertactions). OnComplete (data=>{ if ( data.issuccess) { println ("Insert data result", data) //Add succeeded after updating last table val lastid=words.last.id Sync.lastactor! (Byoffset_upsert_offset,tablename,lastid) } else{Self ! ( byoffset_insert,words)}} ) }
Based on Hlists/generics, you do not
Case (byoffset_get,lastid:int) + = {println ("table" +tablename+ "Sync Start by", LastID) val users = Tableq Uery[users]//Val Action=origin_db.run (User.filter (_.id > LastID). Take (page_size). Result) Val Action=or Igin_db.run (Users.filter (_.id > LastID). Take (page_size). Result) Action.oncomplete (data=>{println ("table "+tablename+" Sync get Data ", Data.get.length) if (data.issuccess) {val Users=data.get.tolist if (users.length>0) {future {println (S "Blocking table" +tablename+ "next page 1s start") timeunit.seco Nds.sleep (1) println (S "Blocking table" +tablename+ "next page 1s finished")//sync only consider insert if (Is_just_insert) {self! ( Byoffset_insert,users)}else{//If historical data is updated self! ( byoffset_insert_update,users)}}}else{Future { println (S "Blocking table" +tablename+ "future 5m Start") TimeUnit.MINUTES.sleep (5) println (S " Blocking table "+tablename+" 5m finished ") Self! (Byoffset_get,lastid)} }}else{Future {println (S "Blocking table" +tablename+ "The Future 5m start") Ti MeUnit.MINUTES.sleep (5) println (S "Blocking table" +tablename+ "future 5m finished") Self! (Byoffset_get,lastid)} }})}//Insert data case (Byoffset_insert,users:list[user]) =>{println ("table" +tablename+ "Insert Star T ", users.length) val user = Tablequery[users]//user.+= (user.unapply (users.head). Get) Val insertactions = D Bio.seq (user++=users) dest_db.run (insertactions) OnComplete (data=>{if (data.issuccess) { println ("table" +tablename+ "Insert data result", data)//Added after successful update last table Val lastid=users.last.id Sync.lastactor! (Byoffset_upsert_offset,tablename,lastid)} else{Self! ( byoffset_insert,users)}})}
Scala Slick heterogeneous Table synchronization Service
Https://github.com/cclient/ScalaMysqlSync
Scala slick MySQL field too many tuple issues