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
配置文件保持一致即可
版权声明:本文标题:Linux下的Go编程环境用Zorm与DM DB交互时遇到的‘invalid memory address or nil pointer dereference’问题解读与解决办法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1771938800a3550284.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论