在找不到 Oracle 数据库客户端库时避免 Go 恐慌
Avoiding Go panic when Oracle Database client libraries not found
我有一个用 Go 编写的服务器,可以访问 Oracle 数据库。它工作正常。但是,将有多个实例 运行ning 在不同的(当前为 2 个)位置,其中一些不需要访问数据库。 (他们从他们的对等服务器获得传递给他们的相同信息。)
我想要在所有地方使用相同的可执行文件 运行ning,但有些地方将被配置为不使用数据库,因为它们不需要它。问题是,一旦我导入 OCI 包,它的 init() 函数就会被调用,当它无法与数据库对话时会出现恐慌。
运行 在 Windows Server 2019 上运行 1.12.5。
我尝试将 OCI.DLL 添加到与 .EXE 相同的目录,但它仍然出现错误。
import _ "github.com/mattn/go-oci8"
当我在服务器上 运行 时(没有数据库驱动程序)我得到错误:
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。
正如您所说,将 DLL 添加到与 exe 相同的目录可以解决您的问题,因此如果您希望单个文件仍然有效,您可以让 exe 在启动时复制所有 DLL,甚至如果需要,请在完成后删除。这样,您可以将文件传输到多个位置,但很可能无法在 运行.
时将其保留在一个文件中
切换到 Go goracle driver which delays Oracle client library initialization,直到打开连接以准确处理您的情况,并非所有应用程序用户都连接到 Oracle DB。
我有一个用 Go 编写的服务器,可以访问 Oracle 数据库。它工作正常。但是,将有多个实例 运行ning 在不同的(当前为 2 个)位置,其中一些不需要访问数据库。 (他们从他们的对等服务器获得传递给他们的相同信息。)
我想要在所有地方使用相同的可执行文件 运行ning,但有些地方将被配置为不使用数据库,因为它们不需要它。问题是,一旦我导入 OCI 包,它的 init() 函数就会被调用,当它无法与数据库对话时会出现恐慌。
运行 在 Windows Server 2019 上运行 1.12.5。
我尝试将 OCI.DLL 添加到与 .EXE 相同的目录,但它仍然出现错误。
import _ "github.com/mattn/go-oci8"
当我在服务器上 运行 时(没有数据库驱动程序)我得到错误:
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。
正如您所说,将 DLL 添加到与 exe 相同的目录可以解决您的问题,因此如果您希望单个文件仍然有效,您可以让 exe 在启动时复制所有 DLL,甚至如果需要,请在完成后删除。这样,您可以将文件传输到多个位置,但很可能无法在 运行.
时将其保留在一个文件中切换到 Go goracle driver which delays Oracle client library initialization,直到打开连接以准确处理您的情况,并非所有应用程序用户都连接到 Oracle DB。