golang适配GBase8s(南大通用)数据库

打印 上一主题 下一主题

主题 812|帖子 812|积分 2436

本文主要解说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

  1. gbase01  onsoctcp        ip  9088    g=db_group
  2. cm_update       group   -       -       i=2,c=0
  3. w1      onsoctcp        ip  18888   g=cm_update
  4. cm_read         group   -       -       i=3,c=0
  5. 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/sqlhostsexportLDL​IBRARYP​ATH=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连接国产数据库

  1. func init() {
  2.         file, err := os.Open("config.xml")
  3.         if err != nil {
  4.                 Log.Info("error:%v", err)
  5.                 return
  6.         }
  7.         defer file.Close()
  8.         config, err := ioutil.ReadAll(file)
  9.         if err != nil {
  10.                 Log.Info("error:%v", err)
  11.                 return
  12.         }
  13.         configValue := SConfig{}
  14.         err = xml.Unmarshal(config, &configValue)
  15.         if err != nil {
  16.                 Log.Error("error:%v", err)
  17.                 return
  18.         }
  19.         strKey := configValue.Server.Aid + configValue.Server.Elogo
  20.         var strPassword string
  21.         var strUsername string
  22.         strPassword = configValue.DataBase.Password
  23.         strUsername = configValue.DataBase.User
  24.         fmt.Printf("strPassword:%v\n", strPassword)
  25.         fmt.Printf("strUsername:%v\n", strUsername)
  26.         ServerPort = configValue.Server.Port
  27.         var dbDSN = ""      //dataSourceName
  28.         var driverName = "" //驱动名
  29.         var DbServer = configValue.DataBase.Host + ":" + configValue.DataBase.Port
  30.         if configValue.DataBase.DbType == "mysql" {
  31.                 fmt.Printf("mysql database\n")
  32.                 driverName = "mysql"
  33.                 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)
  34.         } else if configValue.DataBase.DbType == "shentong" {
  35.                 fmt.Printf("shentongsql database\n")
  36.                 /*driverName = "odbc"
  37.                 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)*/
  38.                 driverName = "aci"
  39.                 dbDSN = fmt.Sprintf("%s/%s@%s:%s/%s", strUsername, strPassword, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName)
  40.         } else if configValue.DataBase.DbType == "dameng" {
  41.                 strPassword = CheckAndModifyString(strPassword)
  42.                 fmt.Printf("dmsql database\n")
  43.                 driverName = "dm"
  44.                 //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)
  45.                 dbDSN = fmt.Sprintf("%s://%s:%s@%s?schema=%s", driverName, strUsername, strPassword, DbServer, configValue.DataBase.DBName)
  46.         } else if configValue.DataBase.DbType == "kingbase" {
  47.                 fmt.Printf("kingbase database\n")
  48.                 driverName = "odbc"
  49.                 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)
  50.         } else if configValue.DataBase.DbType == "GBase8s" {
  51.                 fmt.Printf("GBase8s database\n")
  52.                 driverName = "odbc"
  53.                 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)
  54.         }
  55.         dbType = configValue.DataBase.DbType
  56.         // 打开连接失败
  57.         MysqlDb, MysqlDbErr = sql.Open(driverName, dbDSN)
  58.         //defer MysqlDb.Close();
  59.         if MysqlDbErr != nil {
  60.                 panic("数据源配置不正确: " + MysqlDbErr.Error())
  61.         }
  62.         // 最大连接数
  63.         MysqlDb.SetMaxOpenConns(100)
  64.         // 闲置连接数
  65.         MysqlDb.SetMaxIdleConns(20)
  66.         // 最大连接周期
  67.         MysqlDb.SetConnMaxLifetime(100 * time.Second)
  68.         if MysqlDbErr = MysqlDb.Ping(); nil != MysqlDbErr {
  69.                 panic("数据库链接失败: " + MysqlDbErr.Error())
  70.         }
  71. }
复制代码
Go测试步伐运行测试

  1. 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;"
复制代码
  1. ./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

    • 解决方式
    • 利用
      1. ldd gbase-test
      复制代码
      检察so依赖
      1. linux-vdso.so.1 =>  (0x00007fff083d1000)
      2. libodbc.so.2 => /data/libodbc.so.2 (0x00007f95d721c000)
      3. libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f95d7000000)
      4. libc.so.6 => /lib64/libc.so.6 (0x00007f95d6c32000)
      5. libdl.so.2 => /lib64/libdl.so.2 (0x00007f95d6a2e000)
      6. libiconv.so.2 => /data/linkdood/im/cpp/libs/libiconv.so.2 (0x00007f95d6745000)
      7. /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} [

    • 解决方式
    • 利用
      1. vim $ODBCINI
      复制代码
      检察配置 是否配置一下参数
      1. [ODBC]
      2. UNICODE=UCS-2
      复制代码

  • 非常 出现 xxx.so不存在`

    • 解决方式
    • 确认so库是否存在,假如存在检测依赖是否存在
    • 利用 ldd xxx.so 检察so依赖是否存在

总结

国产化是大势所趋,现在主流的国产数据库有达梦,金仓,神通,优炫等,博主会在后续补充其他国产数据库的适配,敬请期待。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表