【问题标题】:Avoiding Go panic when Oracle Database client libraries not found在未找到 Oracle 数据库客户端库时避免出现恐慌
【发布时间】:2019-06-04 00:54:41
【问题描述】:

我有一个用 Go 编写的服务器来访问 Oracle 数据库。它工作正常。但是,将有多个实例在不同的(目前是 2 个)位置运行,其中一些不需要访问数据库。 (他们从对等服务器获得相同的信息。)

我希望在所有地方都运行相同的可执行文件,但有些会被配置为不使用数据库,因为他们不需要它。问题是,一旦我导入 OCI 包,它的 init() 函数就会被调用,当它无法与数据库通信时会出现恐慌。

在 Windows Server 2019 上运行 GO 1.12.5。

我尝试将 OCI.DLL 添加到与 .EXE 相同的目录中,但它仍然崩溃。

import _ "github.com/mattn/go-oci8"

当我在服务器上运行时(没有 DB 驱动程序),我得到了错误:

panic: OCIEnvCreate error

goroutine 1 [running]:
github.com/mattn/go-oci8.init.0()
        D:/Golang/src/github.com/mattn/go-oci8/globals.go:160 +0x130

当我不需要数据库访问时,我想避免这种恐慌。我更喜欢一个没有条件构建混乱的 .EXE。

【问题讨论】:

  • 如果您有一个数据访问层,您可能会以这样一种方式编写它,即它的调用是“什么都不做”。但正确的做法是让您的应用程序足够智能,不会在 Oracle 数据库驱动程序不存在时“恐慌”,而最简单的方法可能是条件构建。
  • 谢谢。顺便说一句,我刚刚发现,如果我将所有这些 DLL 复制到同一位置,它运行正常:oci.dll ocijdbc12.dll ociw32.dll Oracle.DataAccess.dll oramysql12.dll orannzsbb12.dll oraocci12.dll oraocci12d.dll oraociei12.dll oraons.dll OraOps12.dll orasql12.dll

标签: oracle go oracle-call-interface


【解决方案1】:

切换到 Go goracle driverdelays Oracle client library initialization 直到完全打开连接以处理您的情况,并非所有应用程序用户都连接到 Oracle DB。

【讨论】:

    【解决方案2】:

    正如您所说,将 DLL 添加到与 exe 相同的目录可以解决您的问题,因此,如果您希望单个文件仍然可以工作,您可以让 exe 在启动时复制所有 DLL,甚至删除如果你愿意,什么时候完成。这样,您可以将文件传输到多个位置,但很可能无法在运行时将其保留为一个文件。

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多