apache mysql go_golang,mysql_go 语言中mysql操作200万数据时应该如何写?,golang,mysql - phpStudy...

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

在写一个将 discuzx 的 post 数据的 bbcode 转换成 html 的功能。

但是转换过程中,越到后面,越卡了。

本来想学学并发的,无奈不会啊。。。太菜了。

注释掉的是想要弄的。。。

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

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

}()

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

//fmt.Println(v.pid)

}

for _, _ = range mypost {

fmt.Println(&c)

} */

}

func ShowMsg(c chan post, mypost post) {

//fmt.Println(mypost.pid)

c

}

相关阅读:

absolute和relative的区别很大?

windows目录分隔符是\,但D:\JavaBooks和D:/JavaBooks为什么都可以正确地打开JavaBooks目录?

使用Scrapy中的Request的时候,怎么把拿到的内容编码转换为utf-8?

请问使用requests如何指定使用的User-agent

mysql如何日期筛选

Python 和Qt C++程序如何有效的通信

pm2 node-schedule, 为什么代码会在每个进程中重复执行?

能否给个响应式布局的简单例子??

在同一个局域网内ipad如何与window快速传视频文件

Useful code search engines for Javascript

C语言中malloc问题? sizeof?

linux 运行桌面环境后 通过快捷键(或命令) 让某窗口获得焦点

python 公钥解密时报错 block type is not 01

第一次接触kohana求资料

typecho安装成功后访问404(apache)

javascript 有没有php中的exit()函数呢?

面向过程编程和函数式编程有什么区别?

html 表头 thead的position设置 fixed 后字段标题宽度不和内容宽度等宽怎么解决呢?

ipad 显示输入法的时候显示问题

关于 Android 监听某个 View 之外的触摸事件关闭该 View

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值