为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:Manjaro 21.0.5 Ornara
【CPU】:Intel Core i5-8400
【问题描述】*:查询多条数据时,假如返回数据中有text类型并数据比较多点时,会使标准库的Rows.Next函数报错,怀疑是查询过程中数据库会话连接中断了
报错详情:
panic: Error 6001: 网络通信异常 load err
stack info:
1). gitee.com/chunanyong/dm.(*dm_build_1285).dm_build_1319.func1
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/a.go:162
2). runtime.gopanic
/home/levi/.gvm/gos/1.15.6/src/runtime/panic.go:969
3). gitee.com/chunanyong/dm.(*Dm_build_953).Dm_build_983
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/c.go:97
4). gitee.com/chunanyong/dm.(*dm_build_1285).dm_build_1319
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/a.go:182
5). gitee.com/chunanyong/dm.(*dm_build_1285).dm_build_1324
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/a.go:234
6). gitee.com/chunanyong/dm.(*dm_build_1285).Dm_build_1346
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/a.go:320
7). gitee.com/chunanyong/dm.(*DmConnection).close
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/o.go:497
8). gitee.com/chunanyong/dm.(*DmConnection).Close
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/o.go:261
9). database/sql.(*driverConn).finalClose.func2
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:592
10). database/sql.withLock
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:3284
11). database/sql.(*driverConn).finalClose
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:590
12). database/sql.(*DB).Close
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:847
13). runtime.gopanic
/home/levi/.gvm/gos/1.15.6/src/runtime/panic.go:969
14). gitee.com/chunanyong/dm.(*innerRows).HasNextResultSet
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/v.go:287
15). gitee.com/chunanyong/dm.(*DmRows).hasNextResultSet
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/v.go:136
16). gitee.com/chunanyong/dm.(*DmRows).HasNextResultSet
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/v.go:54
17). database/sql.(*Rows).nextLocked
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:2871
18). database/sql.(*Rows).Next.func1
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:2836
19). database/sql.withLock
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:3284
20). database/sql.(*Rows).Next
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:2835
21). m/tests.Test3
/home/levi/work/go/fx-sqlexec-server/tests/test3.go:41
22). main.main
/home/levi/work/go/fx-sqlexec-server/src/main.go:17
23). runtime.main
/home/levi/.gvm/gos/1.15.6/src/runtime/proc.go:204
24). runtime.goexit
/home/levi/.gvm/gos/1.15.6/src/runtime/asm_amd64.s:1374
goroutine 1 [running]:
gitee.com/chunanyong/dm.(*innerRows).HasNextResultSet(0xc0000c0780, 0x0)
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/v.go:287 +0x189
gitee.com/chunanyong/dm.(*DmRows).hasNextResultSet(...)
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/v.go:136
gitee.com/chunanyong/dm.(*DmRows).HasNextResultSet(0xc0005fd280, 0xb29680)
/home/levi/work/go/pkg/mod/gitee.com/chunanyong/dm@v1.8.0/v.go:54 +0x5a
database/sql.(*Rows).nextLocked(0xc00007e700, 0xc000000000)
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:2871 +0x182
database/sql.(*Rows).Next.func1()
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:2836 +0x3c
database/sql.withLock(0xb24ac0, 0xc00007e730, 0xc0007a5d08)
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:3284 +0x69
database/sql.(*Rows).Next(0xc00007e700, 0xc000021710)
/home/levi/.gvm/gos/1.15.6/src/database/sql/sql.go:2835 +0x87
m/tests.Test3()
/home/levi/work/go/fx-sqlexec-server/tests/test3.go:41 +0x2bc
main.main()
/home/levi/work/go/fx-sqlexec-server/src/main.go:17 +0x39
exit status 2
查询两条成功:
测试代码:
package test
import (
"database/sql"
"fmt"
"github.com/axgle/mahonia"
"time"
"gitee.com/chunanyong/dm"
)
func Test3() {
dsn := "dm://FXCASETEST:123456789@127.0.0.1:5237"
sqltext := "select * from users limit 3"
db, err := sql.Open("dm", dsn)
if err != nil {
fmt.Println(err.Error())
}
defer db.Close()
stmt, err := db.Prepare(sqltext)
if err != nil {
fmt.Println(err.Error())
}
defer stmt.Close()
rows, err := stmt.Query()
if err != nil {
fmt.Println(err.Error())
}
defer rows.Close()
cols, err := rows.Columns()
if err != nil {
fmt.Println(err.Error())
}
colsdata := make([]interface{}, len(cols))
for i := 0; i < len(cols); i++ {
colsdata[i] = new(interface{})
}
//遍历每一行
list := make([]map[string]interface{}, 0)
for rows.Next() {
rows.Scan(colsdata...) //将查到的数据写入到这行中
dict := make(map[string]interface{})
for i, val := range colsdata {
field := cols[i]
setMap(dict, field, val) //打印此行
}
list = append(list, dict)
}
if err != nil {
fmt.Println(err.Error())
}
fmt.Println("list", list)
}
func setMap(dict map[string]interface{}, field string, val interface{}) {
k := val.(*interface{})
switch v := (*k).(type) {
case nil:
dict[field] = nil
case bool:
dict[field] = bool(v)
case []byte:
dict[field] = convertToString(string(v), "gbk", "utf-8")
case *dm.DmClob:
len, _ := v.GetLength()
str, _ := v.ReadString(1, int(len))
dict[field] = str
case time.Time:
dict[field] = v.Format("2006-01-02 15:04:05.000")
default:
dict[field] = v
}
}
func convertToString(src string, srcCode string, tagCode string) string {
srcCoder := mahonia.NewDecoder(srcCode)
srcResult := srcCoder.ConvertString(src)
tagCoder := mahonia.NewDecoder(tagCode)
_, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
result := string(cdata)
return result
}
数据库表结构:
CREATE TABLE "FXCASETEST"."USERS"
(
"USERID" VARCHAR(50),
"ENNAME" VARCHAR(50),
"PWD" VARCHAR(50),
"DPID" VARCHAR(50),
"CNNAME" VARCHAR(50),
"SEX" INT DEFAULT 0,
"PHONE" VARCHAR(50),
"EMAIL" VARCHAR(50),
"FOXNUM" VARCHAR(50),
"ADDRESS" VARCHAR(100),
"POSTNUM" VARCHAR(50),
"DESTEXT" CLOB,
"RULEID" VARCHAR(50),
"UICONFIG" CLOB,
"PORTALCONFIG" CLOB,
"RANKID" VARCHAR(50),
"ODPIDS" VARCHAR(50),
"JOBPOSITION" VARCHAR(50),
"STATUS" VARCHAR(50),
"CREATETIME" TIMESTAMP(0),
"CONTENT" TEXT) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON COLUMN "FXCASETEST"."USERS"."JOBPOSITION" IS '职务';
COMMENT ON COLUMN "FXCASETEST"."USERS"."STATUS" IS '所属科室级别';
表数据:
insert into "FXCASETEST"."USERS" ("USERID","ENNAME","PWD","DPID","CNNAME","SEX","PHONE","EMAIL","FOXNUM","ADDRESS","POSTNUM","DESTEXT","RULEID","UICONFIG","PORTALCONFIG","RANKID","ODPIDS","JOBPOSITION","STATUS","CREATETIME","CONTENT") values ('U000001', 'admin', '1', 'D000016', '管理员', 1, '1331111111', null, null, null, '0', '0', null, null, null, null, '', null, '1', '2021-04-25 11:22:33', '{"BigIntSupported":995815895020119788889,"date":"20180322","message":"Success !","status":200,"city":"北京","count":632,"data":{"shidu":"34%","pm25":73,"pm10":91,"quality":"良","wendu":"5","ganmao":"极少数敏感人群应减少户外活动","yesterday":{"date":"21日星期三","sunrise":"06:19","high":"高温 11.0℃","low":"低温 1.0℃","sunset":"18:26","aqi":85,"fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},"forecast":[{"date":"22日星期四","sunrise":"06:17","high":"高温 17.0℃","low":"低温 1.0℃","sunset":"18:27","aqi":98,"fx":"西南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"23日星期五","sunrise":"06:16","high":"高温 18.0℃","low":"低温 5.0℃","sunset":"18:28","aqi":118,"fx":"无持续风向","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"24日星期六","sunrise":"06:14","high":"高温 21.0℃","low":"低温 7.0℃","sunset":"18:29","aqi":52,"fx":"西南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"25日星期日","sunrise":"06:13","high":"高温 22.0℃","low":"低温 7.0℃","sunset":"18:30","aqi":71,"fx":"西南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"26日星期一","sunrise":"06:11","high":"高温 21.0℃","low":"低温 8.0℃","sunset":"18:31","aqi":97,"fx":"西南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"}]}}');
insert into "FXCASETEST"."USERS" ("USERID","ENNAME","PWD","DPID","CNNAME","SEX","PHONE","EMAIL","FOXNUM","ADDRESS","POSTNUM","DESTEXT","RULEID","UICONFIG","PORTALCONFIG","RANKID","ODPIDS","JOBPOSITION","STATUS","CREATETIME","CONTENT") values ('U000035', 'test1', '1', 'D000006', 'test1', 0, '1331111111', null, null, null, null, '0', null, null, null, '0', '', null, '1', '2021-04-25 11:33:44', '1');
insert into "FXCASETEST"."USERS" ("USERID","ENNAME","PWD","DPID","CNNAME","SEX","PHONE","EMAIL","FOXNUM","ADDRESS","POSTNUM","DESTEXT","RULEID","UICONFIG","PORTALCONFIG","RANKID","ODPIDS","JOBPOSITION","STATUS","CREATETIME","CONTENT") values ('U000037', 'test2', '1', 'D000006', 'test2', 0, '1331111111', null, null, null, null, '0', null, null, null, '2', '', null, '1', '2021-04-25 11:33:44', '1');
测试查询长文本(TEXT)内容时,长文本内容比较大,查询多条语句时就会出发标准库Rows.Next()这个函数报错。报错原因应该是数据库查询已经断开连接。