原同步服务正常,因需,对方单表新增字段,超过22条

sbt assembly 编译出错

too many elements for tuple: 26, allowed: 22

scala case class 最多只支持22个构造参数

遂找解决办法

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

最终应用slickless解决

部分示例

import slick.jdbc.H2Profile.api._
import shapeless.{ HList, ::, HNil, Generic }
import slickless._ case class User(id: Long, email: String) class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Long]( "id", O.PrimaryKey, O.AutoInc )
def email = column[String]("email") def * = (id :: email :: HNil).mappedWith(Generic[User])
} lazy val users = TableQuery[Users]

 

基于 tupled 需要作转换

    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.filter(_.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")
TimeUnit.SECONDS.sleep(1)
println(s"Blocking next page 1s finished")
//同步时只考虑insert
if(is_just_insert){
self !(BYOFFSET_INSERT,words)
}else{
//如果会更新历史数据
self !(BYOFFSET_INSERT_UPDATE,words)
}
}
}else{
//拿到最新数据 等待5分钟
Future {
println(s"Blocking future 5m start")
TimeUnit.MINUTES.sleep(5)
println(s"Blocking 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)
      }
}
      })
}
//插入数据
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)
//添加成功后更新last表
val lastid=words.last.id
Sync.lastActor !(BYOFFSET_UPSERT_OFFSET,tablename,lastid)
}else{
self !(BYOFFSET_INSERT,words)
}
})
}

 

基于HLists/Generics 则不必

  case (BYOFFSET_GET,lastid:Int) => {
println("table "+tablename+" sync start by",lastid)
val users = TableQuery[Users]
// val action=ORIGIN_DB.run(User.filter(_.id > lastid).take(PAGE_SIZE).result)
val action=ORIGIN_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.SECONDS.sleep(1)
println(s"Blocking table "+tablename+" next page 1s finished")
//同步时只考虑insert
if(is_just_insert){
self !(BYOFFSET_INSERT,users)
}else{
//如果会更新历史数据
self !(BYOFFSET_INSERT_UPDATE,users)
}
}
}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)
}
}
}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)
}
}
})
}
// 插入数据
case (BYOFFSET_INSERT,users:List[User])=>{
println("table "+tablename+" insert start",users.length)
val user = TableQuery[Users]
//User.+=(User.unapply(users.head).get)
val insertActions = DBIO.seq(
user++=users
)
DEST_DB.run(insertActions).onComplete(data=>{
if (data.isSuccess){
println("table "+tablename+" insert data result",data)
//添加成功后更新last表
val lastid=users.last.id
Sync.lastActor !(BYOFFSET_UPSERT_OFFSET,tablename,lastid)
}else{
self !(BYOFFSET_INSERT,users)
}
})
}  

scala slick 异构表同步服务

https://github.com/cclient/ScalaMysqlSync

scala slick mysql 字段过多 tuple问题的更多相关文章

  1. scala slick mysql utf8mb4 支持

    语言  scala sql包  slick 3.2.0 数据库  mysql https://stackoverflow.com/questions/36741141/scala-slick-jdbc ...

  2. Mysql字段类型与合理选择

    字段类型 数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许 ...

  3. Spark使用Java、Scala 读取mysql、json、csv数据以及写入操作

    Spark使用Java读取mysql数据和保存数据到mysql 一.pom.xml 二.spark代码 2.1 Java方式 2.2 Scala方式 三.写入数据到mysql中 四.DataFrame ...

  4. MySQL字段之集合(set)枚举(enum)

    MySQL字段之集合(set)枚举(enum) (2008-12-23 13:51:23) 标签:it  分类:MySQL 集合 SET mysql> create table jihe(f1 ...

  5. mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别

    mysql字段varchar区分大小写utf8_bin.utf8_general_ci编码区别 在mysql中存在着各种utf8编码格式:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大 ...

  6. MySQL字段联合去重sql

    MySQL字段联合去重sql 例如数据 id,name1,name2 1 a x 2 a y 3 b x 4 a y 5 a x 联合去重name1,name2的结果为 id,name1,name2 ...

  7. mysql字段默认值不生效的问题解决(上)

    在项目中使用mybatis做为持久层框架,mysql数据库.项目上线前,DBA要求我们将每张数据库表中的字段都设置默认值和not null.之前项目中有一些insert语句是将表中所有字段都列出来,然 ...

  8. MySQL字段属性NUll的注意点

    MySQL字段属性应该尽量设置为NOT NULL 除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL.这看起来好像有点争议,请往下看. 空值("&quo ...

  9. (转)MySQL字段类型详解

    MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...

随机推荐

  1. UVA 11922 伸展树Splay 第一题

    上次ZOJ月赛碰到一个题目要求对序列中的某个区间求gcd,并且还要随时对某位数字进行修改 插入 删除,当时马上联想到线段树,但是线段树不支持增删,明显还是不可以的,然后就敲了个链表想暴力一下,结果TL ...

  2. 吴裕雄--天生自然MySQL学习笔记:MySQL 创建数据表

    创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (column_name col ...

  3. CYPHER 语句(Neo4j)

    CYPHER 语句(Neo4j) 创建电影关系图 新增 查找 修改 删除 导入 格式转换 创建电影关系图 CREATE (TheMatrix:Movie {title:'The Matrix', re ...

  4. 85.常用的返回QuerySet对象的方法使用详解:defer,only

    defer(),only(): 这两个方法都会返回一个"QuerySet"对象,并且这个"QuerySet"中装的是模型,不像values()和values_l ...

  5. 201503-1 图像旋转 Java

    思路: 观察输入和输出可以发现,第三列输出为第一行,第二列输出为第二行,第一列输出为第三行.循环即可 import java.util.Scanner; //得分80,本题最高需要输入100W次,因为 ...

  6. webgis笔记

    3.8(02) .特点:由服务端进行数据管理 开源的GO sever WMS/WCS/WTS 1sever/2engine/3database/4standard 扩展的空间数据库,存矢量.栅格.直接 ...

  7. kubectl 常用命令一

    1.kubectl logs <options>  <PodName> -f -p, --previous --since= No. --since-time= --tail ...

  8. 题解 P5837 【[USACO19DEC]Milk Pumping】

    这题其实想法挺简单的,因为他只需要简单的把每个点的花费和流量用dp记下来就好了 1.怎么记: 首先考虑dp的状态.由于所在的点和流量都要记,所以dp开二维,一维记所在的点,另一维记去哪 //dp[i] ...

  9. pip anaconda 添加国内镜像

    源地址 官方默认镜像太慢.换成国内源比较快.几个源的地址: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun. ...

  10. redis备忘录

    Redis 是一个基于内存的高性能key-value数据库.Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数 ...