为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM Database Server 64 V8
DB Version: 0x7000c
03134283938-20221019-172201-20018
driver 8.1.3.12
【操作系统】:centos7
【CPU】: Intel Xeon Processor
【问题描述】*:
驱动不支持自动重连
一般情况下访问db的代码
dsn := "dm://xxx:xxx@xxxxx:5236?autoCommit=false"
db, err := sql.Open("dm", dsn)
db.Exec("xxxx")
sql.Db是个包含连接池的对象,正常golang的代码,后面使用db一般都会复用这个对象,而不是重新Open一个。
如果停掉达梦服务器,db.Exec(xxx)会返回网络通信异常。这个是正常的。
但如果启动达梦服务器,恢复服务后, db.Exec(xxx),并不会自动恢复,而是继续返回网络通信异常。必须重新Open,得到新的db对象之后才能连上服务器
如果是mysql的话,mysql服务器一旦恢复,db.Exec就会恢复,不需要应用自己重建db。
这块本身可以在应用层面检查异常,重建db来解决。但感觉并不合理,这块如果要降低迁移成本,应该把这个重连机制加到驱动中,而不是逼迫应用自己去检查异常,重建db对象。
补充一下
groups.google.com/g/golang-nuts/c/qd2TEndsxi4
可以参考下这个
postgresql的驱动一开始也没有这个逻辑,后面加上了
现在的问题就是同样的代码,mysql/postgre驱动,db重启,进程不用重启,进程恢复后业务自动恢复
达梦驱动,db重启后,进程永远连不了db,必须重启进程,或者增加监测机制,自己主动重建db对象