ckx0709 2019-03-20 22:07 采纳率: 0%
浏览 1704

go 读取本地大文本数据,跑多协程同时写入数据库,随机发生重复写入的情况。

func init() {
//建立数据可链接
db, e = sqlx.Connect("mysql", "root:123456@tcp(127.0.0.1:3306)/gowk")
HandleError(e, "sqlx.Connect")
defer db.Close()

//必要时建表
_, e = db.Exec("create table if not exists t_bigData_kf(id int primary key auto_increment,name varchar(30),idcard char(18));")
HandleError(e, "db.Exec create table")
fmt.Println("数据表已创建")

//初始存取数据管道
chkp = make(chan *kfperson, 10000000)
chbd = make(chan *kfperson, 100)
//开启1000条协程写入数据,
for i := 0; i < 100; i++ {
    go insertKftable()
}
//准备一个处理脏数据的协程
go writeBadTxt()

//创建一个失败数据Txt
A_bad, _ = os.OpenFile("E:/假数据/清洗数据/A_bad.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0754)
defer A_bad.Close()

//读取大数据文本
file, e := os.Open("E:/假数据/清洗数据/A.txt")
HandleError(e, "os.Open")
defer file.Close()
//以缓存的方式读出,区别于ioutil.ReadFile()一次性读入文件到内存,不适合大文本的读取
reader := bufio.NewReader(file)
//kfps := new(kfperson)
for {
    linStr, e := reader.ReadString('\n')
    if e == io.EOF {
        close(chbd)
        close(chkp)
        break
    }
    HandleError(e, "reader.ReadString")
    linSplic := strings.Split(linStr, ",")
    //kfps.Name, kfps.Idcard = linSplic[0], linSplic[1]

    name,idcard:=linSplic[0], linSplic[1]
    kfps := kfperson{Name: name, Idcard: idcard}

    chkp <- &kfps
}

}

func writeBadTxt() {
writer := bufio.NewWriter(A_bad)
for ps := range chbd {
writer.WriteString(ps.Name + "," + ps.Idcard + "\n")
fmt.Println("***************************************", "Gid:", GetGID())
}
writer.Flush()
}

func insertKftable() {

for ps := range chkp {
    _, e := db.Exec("insert into t_bigData_kf(name,idcard) values(?,?);", ps.Name, ps.Idcard)
    if e == nil {
        fmt.Println("chkp:", len(chkp), "\t", "Gid:", GetGID())
    } else {
        chbd <- ps
    }
}

}


```这些代码我看了一个晚上,我找不出问题在哪里?请求高手指点迷津!
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 10:45
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码看起来像是在尝试将大型文本文件转换为Go语言中的数据结构,并将其插入MySQL数据库中。但是,在实际操作过程中遇到了一些问题。

    首先,你需要确保你的MySQL服务器已经启动并且可以访问。然后,你可能需要调整你的MySQL配置文件(通常是my.cnf),以便能够连接到你的数据库实例。

    其次,你的SQL语句可能会有一些错误或不正确的语法。例如,你没有正确地定义字段类型或者使用了无效的数据类型。此外,你的查询语句也存在一些逻辑错误。例如,如果你正在试图插入多个行,你应该使用INSERT INTO语句来完成这个任务,而不是通过循环逐个插入行。

    最后,由于你没有提供具体的错误信息和日志输出,我无法确定具体的问题所在。然而,你可以检查以下内容:

    • 确保你的MySQL配置文件是正确的,并且包含正确的数据库名称、用户名、密码以及主机名等信息。
    • 检查你的SQL语句是否有语法错误。
    • 检查你的查询语句是否有逻辑错误。
    • 检查你的代码是否正确地处理了异常情况,比如如果某个查询返回非零状态码,则应该捕获并处理异常。

    希望这些建议能帮助你解决问题。如果你还有其他疑问,请随时提问。

    评论

报告相同问题?