admin 管理员组

文章数量: 1184232

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

数据库连接配置为:

funcmain(){//自定义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方法,默认使用的就是defaultDaovar 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 配置文件保持一致即可

本文标签: 数据库连 配置文件 默认