zoukankan      html  css  js  c++  java
  • 经验教训:excel大量数据导入Mysql的血泪史

    先后遇到的问题:

      1.插入速度太慢

      2.Excel的数据太脏,同一列中混合有许多不同类型的值(日期,整数,浮点数)

      3.字符集导致的字段太长问题(Data too long for column Data too long for column) [整了我一天,那一天就算我睡了个饱心情美汁汁,一看到这个问题还是会让我眉头紧皱]

      4.Table is full,小破阿里云服务器没空间了

    解决过程:

      1.插入速度太慢:

        如果是一条条的简单插入,两分钟才插入1k+条,实在是太慢了。于是上网查了一些方法。

        1.改用 PreparedStatement来批插入, 也就是 用 insert into table (a,b,c,d,e,......) values( ?, ? , ? ,......) 的方法去插入

        每用 setObject 设置完一个 括号 : () 里的值就 addBatch, 最后 executeBatch , 但实际上还是很慢,和之前没什么区别,或许是我用的方法有问题,具体为什么还要去研究下Mysql的实现

          2.改用另一种批插入方法:多值插入

        也就是把 sql 语句写成 insert into table (a,b,c,d,e,......) values (x,y,z,...), (x1,y1,z1,...), (..,..,..,...), (..,..,..,...), (..,..,..,...), (..,..,..,...)......

        用的不是PreparedStatement ,而是普通 statement 的 execute,有明显的效果,原本要十几分钟来插入的 8m的excel,只用十几秒就可以插入到数据库

      2.编码问题    

        但是随之而来发生的是 Data too long for column Data too long for column 的错误,困扰了我许久,我的列明明长度管够,为什么还报错?

        按照网上的方法试了许久,还是不行,于是在想是不是和 PreparedStatement 和 Statement 的区别。

        最后改用 PreparedStatement , 还是用多值插入 insert into table (a,b,c,d,e,......) values (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...)......

        实现起来比较复杂,但是试了许久还是有问题,于是把数据库表中 对应列的 编码改成 utf8,并且适当增长长度,最后成功,具体为什么可能要日后查看实现才能知道

        后来又用旧的代码,也就是之前普通statement的语句测试了一下,数据插入成功,可以断定是列的编码不正确,应该选用 utf8

      3.数据太脏

        知道表的格式,把表头及其对应的类型(按照表头的下一行判断,可能表头的下一列是空的,或者下一列本身不正确,不正确概率比较小,我业务的脏数据一般出现在中后部分),读取出来,建立 表明 - 列类型集合  的映射,如果读进来的值不符合类型,则直接跳过该行,问题解决

        

          

  • 相关阅读:
    MQTT TLS 加密传输
    python多进程并发redis
    各种消息队列的特点
    mqtt异步publish方法
    Numpy API Analysis
    Karma install steps for unit test of Angular JS app
    reinstall bower command
    Simulate getter in JavaScript by valueOf and toString method
    How to: Raise and Consume Events
    获取对象的类型信息 (JavaScript)
  • 原文地址:https://www.cnblogs.com/lqlqlq/p/13740135.html
Copyright © 2011-2022 走看看