热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

go语言中mysql操作200万数据时应该如何写?

在写一个将discuzx的post数据的bbcode转换成html的功能。但是转换过程中,越到后面,越卡了。本来想学学并发的,无奈不会啊

在写一个将 discuzx 的 post 数据的 bbcode 转换成 html 的功能。
但是转换过程中,越到后面,越卡了。
本来想学学并发的,无奈不会啊。。。太菜了。
注释掉的是想要弄的。。。



求个解决方案。代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
package main



import (

    "database/sql"

    "fmt"

    "github.com/frustra/bbcode"

    _ "github.com/go-sql-driver/mysql"

    //"time"

    //"runtime"

    "strconv"

)



const (

    XnFromPost = "bbs_post"

    XnTopost   = "bbs_post"

    DxFromPost = "pre_forum_post"

)



type Hostinfo struct {

    DBUser,

    DBPassword,

    DBname,

    DBHost,

    DBPort,

    DBChar string

}



type post struct {

    pid     int

    message string

}



var OldDB, NewDB *sql.DB



/**

  设置数据库,并连接数据库

*/

func SetDB() (olddata, newdata *sql.DB) {

    var localhost, remotehost Hostinfo



    localhost = Hostinfo{

        "root",

        "123456",

        "xiuno",

        "",

        "3306",

        "utf8",

    }



    remotehost = Hostinfo{

        "root",

        "123456",

        "gxvtc",

        "",

        "3306",

        "utf8",

    }



    olddata, _ = connMysql(&localhost)

    newdata, _ = connMysql(&remotehost)



    return olddata, newdata

}



/**

连接数据库

*/

func connMysql(host *Hostinfo) (*sql.DB, error) {

    //db, err := sql.Open("mysql", "root:123456@/"+dbs+"?charset=utf8")

    if host.DBHost != "" {

        host.DBHost = "tcp(" + host.DBHost + ":" + host.DBPort + ")"

        fmt.Println(host.DBHost)

    }



    db, err := sql.Open("mysql", host.DBUser+":"+host.DBPassword+"@"+host.DBHost+"/"+host.DBname+"?charset="+host.DBChar)

    return db, err

}



func main() {

    OldDB, NewDB = SetDB()

    defer OldDB.Close()

    defer NewDB.Close()

    updatePost()

}



func updatePost() {

    const total = 100



    //selectPost := "SELECT pid,message FROM " + XnFromPost + " ORDER BY pid ASC LIMIT 10"

    selectPost := "SELECT pid,message FROM " + DxFromPost + " ORDER BY pid ASC "

    /*

        Data, err := OldDB.Query(selectPost)

        if err != nil {

            fmt.Println(err.Error())

        }*/

    fmt.Println(selectPost)



    updatePost := "UPDATE " + XnTopost + " SET message = ? WHERE pid = ? limit 1"

    fmt.Println(updatePost)

    stmt, err := OldDB.Prepare(updatePost)

    //insertPost := "INSERT INTO " + XnTopost + " (message,pid) VALUES (?,?)"

    //fmt.Println(insertPost)

    //stmt, err := OldDB.Prepare(insertPost)



    if err != nil {

        fmt.Println(err.Error())

    }



    //mypost := make(map[int]post)



    i := 0

    for {

        tmpNum := i * total



        i++

        tmpSQL := selectPost + " LIMIT " + strconv.Itoa(tmpNum) + "," + strconv.Itoa(total)

        fmt.Println(tmpSQL)

        Data, err := NewDB.Query(tmpSQL)

        //Data, err := NewDB.Query(tmpSQL)

        if err != nil {

            fmt.Println(err.Error())

        }



        tag := false

        //使用并发的方式

        for Data.Next() {

            tag = true

            var pid int

            var msg string

            Data.Scan(&pid, &msg)

            fmt.Println(pid)



            //bbcode转码html

            compiler := bbcode.NewCompiler(true, true)

            msg = compiler.Compile(msg)

            //mypost[pid] = post{pid, msg}

            _, err = stmt.Exec(msg, pid)

            if err != nil {

                fmt.Println("pid: ", pid, err.Error())

            }

        }



        if tag == false {

            fmt.Println("没有数据了...")

            break

        }



    }



    /*

       //直接查找并更新

           for Data.Next() {

               var pid int

               var msg string

               Data.Scan(&pid, &msg)



               //bbcode转码html

               compiler := bbcode.NewCompiler(true, true)

               msg = compiler.Compile(msg)



               mypost[pid] = post{pid, msg}

               //fmt.Println(mypost)

               fmt.Println(pid)



               _, err = stmt.Exec(msg, pid)

               if err != nil {

                   fmt.Println("pid: ", pid, err.Error())

               }

           }

    */



    /*

            //使用并发的方式

            for Data.Next() {

                var pid int

                var msg string

                Data.Scan(&pid, &msg)



                //bbcode转码html

                compiler := bbcode.NewCompiler(true, true)

                msg = compiler.Compile(msg)

                mypost[pid] = post{pid, msg}

            }



        runtime.GOMAXPROCS(runtime.NumCPU())

        c := make(chan post)

        for _, v := range mypost {

            go ShowMsg(c, v)

            /*

                go func() {

                    fmt.Println(v.pid)

                    c <- v.pid

                }()

                <-c

            //time.Sleep(2 * time.Second)

            //fmt.Println(v.pid)

        }



        for _, _ = range mypost {

            fmt.Println(&c)

            <-c

        } */



}



func ShowMsg(c chan post, mypost post) {

    //fmt.Println(mypost.pid)

    c <- mypost

}



   



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
再见看淡_266
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有