本文主要解说golang通过odbc连接GBase8s
情况配置
unixODBC安装
yum -y install unixODBC unixODBC-devel
配置 gbase8s-odbc-driver
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
- 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
export GBASEDBTDIR=/home/gbase8s-odbc-driver
export GBASEDBTSERVER=gbase01
export PATH= G B A S E D B T D I R / b i n : GBASEDBTDIR/bin: GBASEDBTDIR/binATH
export GBASEDBTSQLHOSTS= G B A S E D B T D I R / e t c / s q l h o s t s e x p o r t L D L I B R A R Y P A T H = GBASEDBTDIR/etc/sqlhosts export LD_LIBRARY_PATH= GBASEDBTDIR/etc/sqlhostsexportLDLIBRARYPATH=GBASEDBTDIR/lib: G B A S E D B T D I R / l i b / e s q l : GBASEDBTDIR/lib/esql: GBASEDBTDIR/lib/esql:GBASEDBTDIR/lib/cliLD_LIBRARY_PATH
export ODBCINI=/home/gbase8s-odbc-driver/odbc.ini
执行source /etc/profile生效
配置 驱动 (利用 root) vim /etc/odbcinst.ini
[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
[ODBC]
UNICODE=UCS-2
测试驱动连接
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())
- }
- }
复制代码 Go测试步伐运行测试
- go run . -dsn="DRIVER={com.gbasedbt.jdbc.Driver};DB=testdataserver;UID=gbasedbt;pwd=GBase123;Server=gbase01;CLIENT_LOCALE=zh_CN.57372;DB_LOCALE=zh_CN.57372;"
复制代码- ./gbase-test -dsn="DRIVER={com.gbasedbt.jdbc.Driver};DB=testdataserver;UID=gbasedbt;pwd=GBase123;Server=gbase01;CLIENT_LOCALE=zh_CN.57372;DB_LOCALE=zh_CN.57372;"
复制代码 问题&&解决方式
- 非常:SQLDriverConnect: {01000} [unixODBC][Driver Manager]Can not open lib "com.gbasedbt.jdbc.Driver" : file not found
- 解决方式
- 利用
检察so依赖
- linux-vdso.so.1 => (0x00007fff083d1000)
- libodbc.so.2 => /data/libodbc.so.2 (0x00007f95d721c000)
- libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f95d7000000)
- libc.so.6 => /lib64/libc.so.6 (0x00007f95d6c32000)
- libdl.so.2 => /lib64/libdl.so.2 (0x00007f95d6a2e000)
- libiconv.so.2 => /data/linkdood/im/cpp/libs/libiconv.so.2 (0x00007f95d6745000)
- /lib64/ld-linux-x86-64.so.2 (0x00007f95d7494000)
复制代码
- 检察依赖的so是否存在
- 假如 /data/linkdood/im/cpp/libs/libodbc.so.2版本较老,请联系运维替换
- 利用 grep "cbuilder" /data/libs/* 假如匹配到则说明 odbc so库是老的,内部写死了odbcinst.ini地址
- 非常 查询非常: SQLDriverConnect: {H} [ {0} [
- 非常 出现 xxx.so不存在`
- 解决方式
- 确认so库是否存在,假如存在检测依赖是否存在
- 利用 ldd xxx.so 检察so依赖是否存在
总结
国产化是大势所趋,现在主流的国产数据库有达梦,金仓,神通,优炫等,博主会在后续补充其他国产数据库的适配,敬请期待。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |