golang适配国产数据库

随着国产化的推进,越来越多的企业选择国产数据库替代mysql或者Oracle。

本篇主要介绍golang如何适配国产数据库

主流的国产数据库有达梦,金仓,神通,优炫,南大通用数据库等

前提环境

unixODBC安装

bash 复制代码
yum -y install unixODBC unixODBC-devel

配置 gbase8s-odbc-driver

bash 复制代码
wget https://gbasedbt.com/dl/odbc/GBase8s_3.0.0_1-Linux64-ODBC-Driver.tar.gz --no-check-certificate
tar -zxf GBase8s_3.0.0_1-Linux64-ODBC-Driver.tar.gz

配置 sqlhosts

bash 复制代码
gbase01  onsoctcp        ip  9088    g=db_group
cm_update       group   -       -       i=2,c=0
w1      onsoctcp        ip  18888   g=cm_update
cm_read         group   -       -       i=3,c=0
r1      onsoctcp        ip  19999   g=cm_read

配置环境变量 (使用 root) vim /etc/profile

bash 复制代码
export GBASEDBTDIR=/home/gbase8s-odbc-driver
export GBASEDBTSERVER=gbase01
export PATH=$GBASEDBTDIR/bin:$PATH
export GBASEDBTSQLHOSTS=$GBASEDBTDIR/etc/sqlhosts
export LD_LIBRARY_PATH=$GBASEDBTDIR/lib:$GBASEDBTDIR/lib/esql:$GBASEDBTDIR/lib/cli:$LD_LIBRARY_PATH
export ODBCINI=/home/gbase8s-odbc-driver/odbc.ini

配置 驱动 (使用 root) vim /etc/odbcinst.ini

bash 复制代码
[com.gbasedbt.jdbc.Driver]
Driver=/home/gbase8s-odbc-driver/lib/cli/iclit09b.so
Setup=/home/gbase8s-odbc-driver/lib/cli/iclit09b.so
APILevel=1
ConnectFunctions=YYY
DriverODBCVer=03.51
FileUsage=0
SQLLevel=1
smProcessPerConnect=Y

配置 odbc.ini vim /home/linkdood/gbase8s-odbc-driver/odbc.ini

bash 复制代码
[ODBC]
UNICODE=UCS-2

测试驱动连接

bash 复制代码
isql -v -k "DRIVER={com.gbasedbt.jdbc.Driver};DB=testdataserver;UID=gbasedbt;pwd=GBase123;Server=gbase01;CLIENT_LOCALE=zh_CN.57372;DB_LOCALE=zh_CN.57372;"

golang通过odbc连接国产数据库

func init() {

file, err := os.Open("config.xml")

if err != nil {

Log.Info("error:%v", err)

return

}

defer file.Close()

config, err := ioutil.ReadAll(file)

if err != nil {

Log.Info("error:%v", err)

return

}

configValue := SConfig{}

err = xml.Unmarshal(config, &configValue)

if err != nil {

Log.Error("error:%v", err)

return

}

strKey := configValue.Server.Aid + configValue.Server.Elogo

var strPassword string

var strUsername string

strPassword = configValue.DataBase.Password

strUsername = configValue.DataBase.User

fmt.Printf("strPassword:%v\n", strPassword)

fmt.Printf("strUsername:%v\n", strUsername)

ServerPort = configValue.Server.Port

var dbDSN = "" //dataSourceName

var driverName = "" //驱动名

var DbServer = configValue.DataBase.Host + ":" + configValue.DataBase.Port

if configValue.DataBase.DbType == "mysql" {

fmt.Printf("mysql database\n")

driverName = "mysql"

dbDSN = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", strUsername, strPassword, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, configValue.DataBase.Charset)

} else if configValue.DataBase.DbType == "shentong" {

fmt.Printf("shentongsql database\n")

/driverName = "odbc"
dbDSN = fmt.Sprintf("driver={%s};server=%s;port=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)
/

driverName = "aci"

dbDSN = fmt.Sprintf("%s/%s@%s:%s/%s", strUsername, strPassword, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName)

} else if configValue.DataBase.DbType == "dameng" {

strPassword = CheckAndModifyString(strPassword)

fmt.Printf("dmsql database\n")

driverName = "dm"

//dbDSN = fmt.Sprintf("driver={%s};server=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, DbServer, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)

dbDSN = fmt.Sprintf("%s://%s:%s@%s?schema=%s", driverName, strUsername, strPassword, DbServer, configValue.DataBase.DBName)

} else if configValue.DataBase.DbType == "kingbase" {

fmt.Printf("kingbase database\n")

driverName = "odbc"

dbDSN = fmt.Sprintf("driver={%s};server=%s;port=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)

} else if configValue.DataBase.DbType == "GBase8s" {

fmt.Printf("GBase8s database\n")

driverName = "odbc"

dbDSN = fmt.Sprintf("driver={%s};server=%s;port=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)

}

dbType = configValue.DataBase.DbType

// 打开连接失败

MysqlDb, MysqlDbErr = sql.Open(driverName, dbDSN)

//defer MysqlDb.Close();

if MysqlDbErr != nil {

panic("数据源配置不正确: " + MysqlDbErr.Error())

}

// 最大连接数

MysqlDb.SetMaxOpenConns(100)

// 闲置连接数

MysqlDb.SetMaxIdleConns(20)

// 最大连接周期

MysqlDb.SetConnMaxLifetime(100 * time.Second)

if MysqlDbErr = MysqlDb.Ping(); nil != MysqlDbErr {

panic("数据库链接失败: " + MysqlDbErr.Error())

}

}

相关推荐
荒川之神2 分钟前
ORACLE 闪回技术简介
数据库·oracle
杨荧23 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰30 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
王俊山IT42 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。44 分钟前
c++多线程
java·开发语言
小政爱学习!1 小时前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧1 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv