免安装免配置,直接使用Go 程序访问Oracle
Posted 三墩IT人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了免安装免配置,直接使用Go 程序访问Oracle相关的知识,希望对你有一定的参考价值。
陈琪 平台架构师
背景
Go语言访问Oracle数据库是个比较头疼的问题,主要是因为Oracle没有提供Go语言的驱动,不能像java那样引入个驱动包就能连接,这个问题由来已久,始终没有找到合适的解决方案。之前尝试了两种方案:
1、基于go-oci8
比较典型的是github.com/mattn/go-oci8,需要做三个步骤:
(1)修改oci8.pc文件
(2)设置PKG_CONFIG_PATH变量
(3) 执行PKG-CONFIG 命令
注:pkg-config只是一个命令,不是你安装了一个第三方的库,pkg-config就能知道第三方库的头文件和库文件所在的位置。pkg-config命令是通过查询XXX.pc文件而知道这些的。oci8.pc就是一个Oracle链接库的pc文件
2、使用Python过渡
Python有一个模块cx_Oracle可以与Oracle相连。解决方案是:
(1)使用Python访问Oracle
(2)Go语言调用相应的Python语言Api接口
纠结
上面两种方案都能解决Go语言访问Oracle的问题,但是各有各的纠结。
1、多版本数据库访问时pkg-config冲突问题
如果要同时访问多版本的数据库,就需要写多份oci8.pc文件,指向不同的lib目录,(例如oracle11g , oracle12c),就会在pkg-config 使用的时候发生冲突的问题。
2、两种开发代码的问题
使用Go语言调用python接口访问Oracle。访问没有问题,但是过于复杂,效率比较低。
解决
1、偶然
无意间发现了这个开源的解决方案,决定尝试使用:
github.com/go-goracle/goracle
2、尝试
2.1 开源的通病
开源解决方案,有个通病,就是文档写的及其简单。Goracle开源解决方案的Readme文件就只有如下内容:
2.2 尝试使用
(1) 下载、安装go1.9.4
tar -C/usr/local -xzf go1.9.4.linux-amd64.tar.gz
(2) 下载goracle源码文件
go get -t -u-v gopkg.in/goracle.v2
(3) 参考mysql库调用方式测试访问
mysql通用调用方式如下:
完全参考mysql调用方式,编写oracle调用方式:
注意:sql.Open设置为oracle时,报错如下:
sql: unknowndriver "oracle" (forgotten import?)
说明goracle.v2的代码中为goracle驱动。
(4) 执行程序时报错
panic:ORA-00000: DPI-1047: 64-bit Oracle Client library cannot be loaded:"libclntsh.so
上述报错说明oracle的调用链接库没有指定,需要安装oracle instant client
(5) 参考ODPI-C文档,安装oracle instant client
实质只有三步:
(1)下载、解压instantclient-basic-linux.x64
(2)安装libaio
(3)设置export LD_LIBRARY_PATH
如果需要设置tnsnames.ora 需要配置network/admin
(6) 测试访问db.Ping()
连接成功后,会出现连接失败报错。
用户名密码报错:
ORA-01017:invalid username/password; logon denied
连接串报错:
ORA-12514:TNS:listener does not currently know of service requested in connect descriptor
2.3 完整测试代码
2.4 Go语言优势体现
(1)上述测试代码一次编译,执行程序拷贝至任何linux64位的服务器即可使用
(2)当然,使用前需参考ODPI-C文档,安装oracle instantclient
2.5进阶优化
如何避免使用LD_LIBRARY_PATH设置,像java使用jar包一样方便管理oracle (场景:当有成百上千台服务器需要部署,每一台instant安装目录不同,设置ld_library_path就是相当困难的一件事情)
为解决这个问题,使用如下方法:
(1)创建目录,将代码以及instant包部署至目录
(2)使用CGO_LDFLAGS/CGO_CFLAGS编译源程序
(3)使用objdump –p 命令检查是否包含设置的动态库路径
具体命令如下:
按此方法已经避免设置LD_LIBRARY_PATH,打包程序直接下发至任意服务 器即可直接执行。
(4)将oracle instant client 与源码程序一起打包下发执行
感谢
1、Anthony Tuininga : Oracle DBA 兼开发人员。他是 cx_Oracle,Odpi-C(OracleDatabase Programming Interface)的作者.
2、tgulacsi:匈牙利UNO-SOFT公司开发人员,goracle的作者,后端调用了Odpi-C。
以上是关于免安装免配置,直接使用Go 程序访问Oracle的主要内容,如果未能解决你的问题,请参考以下文章