golang,beego框架使用zorm连接dm数据库在Linux下启动报错invalid memory address or nil pointer dereference
GOPATH=/home/wt207/go-space #gosetup
/home/wt207/go/bin/go build -o /tmp/___1go_build_main_go -gcflags all=-N -l /home/wt207/go-space/insight-client/main.go #gosetup
/home/wt207/GoLand-2021.1.3/plugins/go/lib/dlv/linux/dlv --listen=0.0.0.0:40223 --headless=true --api-version=2 --check-go-version=false --only-same-user=false exec /tmp/___1go_build_main_go --
API server listening at: [::]:40223
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xd34e4e]
goroutine 1 [running]:
gitee.com/chunanyong/dm.(*Properties).GetTrimString(0x0, 0x158d9c9, 0xc, 0x0, 0x0, 0x0, 0x0)
/home/wt207/go-space/pkg/mod/gitee.com/chunanyong/dm@v1.8.1/zv.go:80 +0x6e
gitee.com/chunanyong/dm.(*DmConnector).mergeConfigs(0xc000034600, 0x15b2b55, 0x28, 0x0, 0x0)
/home/wt207/go-space/pkg/mod/gitee.com/chunanyong/dm@v1.8.1/n.go:767 +0x274
gitee.com/chunanyong/dm.(*DmDriver).openConnector(0xc00015ce80, 0x15b2b55, 0x28, 0x0, 0x0, 0x0)
/home/wt207/go-space/pkg/mod/gitee.com/chunanyong/dm@v1.8.1/p.go:79 +0x105
gitee.com/chunanyong/dm.(*DmDriver).OpenConnector(0xc00015ce80, 0x15b2b55, 0x28, 0x0, 0x0, 0x0, 0x0)
/home/wt207/go-space/pkg/mod/gitee.com/chunanyong/dm@v1.8.1/p.go:63 +0x6d
database/sql.Open(0x157561c, 0x2, 0x15b2b55, 0x28, 0x0, 0x0, 0x0)
/home/wt207/go/src/database/sql/sql.go:771 +0x1cb
gitee.com/chunanyong/zorm.newDataSource(0xc00007fb00, 0x0, 0x0, 0x0)
/home/wt207/go-space/pkg/mod/gitee.com/chunanyong/zorm@v1.4.9/dataSource.go:59 +0xdc
gitee.com/chunanyong/zorm.NewDBDao(0xc00007fb00, 0x0, 0x0, 0x0)
/home/wt207/go-space/pkg/mod/gitee.com/chunanyong/zorm@v1.4.9/DBDao.go:70 +0x6b
main.main()
/home/wt207/go-space/insight-client/main.go:54 +0x91
Debugger finished with the exit code 0
数据库连接配置为:
func main() {
//自定义zorm日志输出
//zorm.LogCallDepth = 4 //日志调用的层级
//zorm.FuncLogError = myFuncLogError //记录异常日志的函数
//zorm.FuncLogPanic = myFuncLogPanic //记录panic日志,默认使用ZormErrorLog实现
//zorm.FuncPrintSQL = myFuncPrintSQL //打印sql的函数
//自定义日志输出格式,把FuncPrintSQL函数重新赋值
//log.SetFlags(log.LstdFlags)
//zorm.FuncPrintSQL = zorm.FuncPrintSQL
//dbDaoConfig 数据库的配置.这里只是模拟,生产应该是读取配置配置文件,构造DataSourceConfig
dbDaoConfig := zorm.DataSourceConfig{
//DSN 数据库的连接字符串
DSN: "dm://GO207:GO207USER@192.168.16.137:5236",
//DSN: "./db/test.db",
//数据库驱动名称:mysql,postgres,oci8,sqlserver,sqlite3,dm,kingbase,aci 和DBType对应,处理数据库有多个驱动
DriverName: "dm",
//数据库类型(方言判断依据):mysql,postgresql,oracle,mssql,sqlite,dm,kingbase,shentong 和 DriverName 对应,处理数据库有多个驱动
DBType: "dm",
//MaxOpenConns 数据库最大连接数 默认50
MaxOpenConns: 50,
//MaxIdleConns 数据库最大空闲连接数 默认50
MaxIdleConns: 50,
//ConnMaxLifetimeSecond 连接存活秒时间. 默认600(10分钟)后连接被销毁重建.避免数据库主动断开连接,造成死连接.MySQL默认wait_timeout 28800秒(8小时)
ConnMaxLifetimeSecond: 600,
//PrintSQL 打印SQL.会使用FuncPrintSQL记录SQL
PrintSQL: true,
//DefaultTxOptions 事务隔离级别的默认配置,默认为nil
//DefaultTxOptions: nil,
//DefaultTxOptions: &sql.TxOptions{Isolation: sql.LevelDefault},
}
// 根据dbDaoConfig创建dbDao, 一个数据库只执行一次,第一个执行的数据库为 defaultDao,后续zorm.xxx方法,默认使用的就是defaultDao
var err error
dbDao, err = zorm.NewDBDao(&dbDaoConfig)
//标记测试失败
if err != nil {
fmt.Println("dm数据库连接失败:", err)
} else {
fmt.Println("dm数据库连接成功")
}
beego.Run()
}
原因
原因是获取系统默认的dm_svc.conf
配置文件失败,我们根据控制台的错误提示,可以找到如下的获取不同系统的dm_svc.conf
配置文件的代码片段。
if filePath == "" {
switch runtime.GOOS {
case "windows":
filePath = os.Getenv("SystemRoot") + "\\system32\\dm_svc.conf"
case "linux":
filePath = "/etc/dm_svc.conf"
default:
return
}
}
根据Windows系统的默认文件路径找到dm_svc.conf
配置文件,打开发现,其内容如下
TIME_ZONE=(480)
LANGUAGE=(cn)
解决方案
在Linux虚拟机的/etc
路径下创建dm_svc.conf
配置文件,内容与Windows的os.Getenv("SystemRoot") + "\\system32\\dm_svc.conf"
路径下的dm_svc.conf
配置文件保持一致即可