免安装免配置,直接使用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文件就只有如下内容:

免安装、免配置,直接使用Go 程序访问Oracle


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通用调用方式如下:

免安装、免配置,直接使用Go 程序访问Oracle

完全参考mysql调用方式,编写oracle调用方式:

免安装、免配置,直接使用Go 程序访问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

免安装、免配置,直接使用Go 程序访问Oracle

实质只有三步:

(1)下载、解压instantclient-basic-linux.x64

(2)安装libaio

(3)设置export LD_LIBRARY_PATH

如果需要设置tnsnames.ora 需要配置network/admin

免安装、免配置,直接使用Go 程序访问Oracle

(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 完整测试代码

免安装、免配置,直接使用Go 程序访问Oracle


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 命令检查是否包含设置的动态库路径

具体命令如下:

免安装、免配置,直接使用Go 程序访问Oracle

按此方法已经避免设置LD_LIBRARY_PATH,打包程序直接下发至任意服务   器即可直接执行。

(4)将oracle instant client 与源码程序一起打包下发执行

免安装、免配置,直接使用Go 程序访问Oracle


感谢

1、Anthony Tuininga : Oracle DBA 兼开发人员。他是 cx_Oracle,Odpi-C(OracleDatabase Programming Interface)的作者.

2、tgulacsi:匈牙利UNO-SOFT公司开发人员,goracle的作者,后端调用了Odpi-C。








以上是关于免安装免配置,直接使用Go 程序访问Oracle的主要内容,如果未能解决你的问题,请参考以下文章

MySql免安装版要怎么配置使用

plsql 免oracle客户端安装

《oracle每日一练》免安装Oracle客户端使用PL/SQL

MySql免安装版l配置方法

免安装Oracle客户端使用PL/SQL

oracle sqlplus免安装的配置instantclient-basiclite