【问题标题】:DB2 connectivity from Python - ibm_db.connect running continuously来自 Python 的 DB2 连接 - ibm_db.connect 连续运行
【发布时间】:2021-09-26 04:29:32
【问题描述】:

我已经为这个问题寻找了几个小时的答案,但不幸的是,我能找到的最接近的是 1 个未回答的问题。 This 是类似的问题,但遗憾的是没有解决方案。

我有一个与 IBM DB2 数据库的有效连接,但 Web 控制台出错了,所以我不得不删除该实例并创建一个新实例。除了用于连接的值之外,我没有更改任何关于连接代码的内容。当我更改这些值时,ibm_db.connect 函数会连续运行。没有输出错误,因为我让它运行了 10 分钟,但什么也没发生。我确实更改了值以强制出错,它会出错,说值不正确。我不知道问题出在哪里,因为我没有信息可以解决。我唯一的想法是 SSL 可能与它有关。

dsn_driver = connection_data['dsn_driver']
dsn_database = connection_data['dsn_database']
dsn_hostname = connection_data['dsn_hostname']
dsn_port = connection_data['dsn_port']
dsn_protocol = connection_data['dsn_protocol']
dsn_uid = connection_data['dsn_uid']
dsn_pwd = connection_data['dsn_pwd']

dsn = (
    "DRIVER={0};"
    "DATABASE={1};"
    "HOSTNAME={2};"
    "PORT={3};"
    "PROTOCOL={4};"
    "UID={5};"
    "PWD={6};").format(dsn_driver, dsn_database, dsn_hostname,
                       dsn_port, dsn_protocol, dsn_uid, dsn_pwd)

try:
    connection = ibm_db.connect(dsn, "", "")
    print("Connected to database: ", dsn_database,
          "as user: ", dsn_uid, "on host: ", dsn_hostname)
    return connection

except:
    print("Unable to connect: ", ibm_db.conn_errormsg())

断点在connection = ibm_db.connect(dsn, "", "")

此数据是从具有以下值的本地 JSON 文件加载的(敏感信息除外)。

{
    "dsn_driver": "{IBM DB2 ODBC DRIVER}",
    "dsn_database":"BLUDB",
    "dsn_hostname": "hostname",
    "dsn_port": "port",
    "dsn_protocol": "TCPIP",
    "dsn_uid": "uid",
    "dsn_pwd": "pwd"
}

我已经尝试了我能想到的一切,但由于没有任何输出,我很遗憾不知道从哪里开始。如果有人有这方面的经验,请告诉我。

谢谢。

编辑:我确实收到了从 ibm_db.connect 方法返回的错误消息

Unable to connect:  [IBM][CLI Driver] SQL30081N  A communication error has been detected. Communication protocol being used: "TCP/IP".  Communication API being used: "SOCKETS".  Location where the error was detected: "xxx.xx.xxx.xxx".  Communication function detecting the error: "recv".  Protocol specific err SQLCODE=-30081054", "*", "0".  SQLSTATE=08001

【问题讨论】:

  • 你是说你在那一行插入了一个调试器断点?您是否尝试过“进入”ibm_db.connect 函数以查看该库中发生了什么?
  • 那是正确的,我在调试器上完成了它,发现它没有继续。我踏入了ibm_db.connect,但什么也没发生:/
  • 你可以使用 jdbc 连接,使用相同的连接细节吗? python 使用 CLI 驱动程序而不是 jdbc。您的 IP 连接详细信息可能不正确,或者您的防火墙沿路径某处阻止了该端口。您的问题表明您使用 SSL,所以如果您不这么认为,那么您的连接字符串可能不正确。
  • 只是一个预感:你在使用 VSCode 吗?您可能需要禁用一个非常小的调试选项来跟踪第 3 方代码:stackoverflow.com/a/56038698/235992 这可能会解决“什么都没有发生”。

标签: python db2


【解决方案1】:

澄清几点:

  1. 当您说“ibm_db.connect 函数连续运行”时,您的意思是您看到 CPU 正在旋转还是只是 python 进程没有通过连接?
  2. 您要连接到什么类型的数据库? DB2 LUW 还是 z/OS?
  3. 您是否尝试过确保连接仍然有效?即您是否尝试过其他链接帖子的建议?这个:

要验证您和数据库之间是否存在网络连接,您可以尝试 telnet xxxxxx 1234(或 nc xxxxxx 1234,其中 xxxxxx 和 1234 分别是服务主机名和端口)

从调试的角度来看,我会查看中间进程的日志:

  1. Db2 Connect 日志(如果您正在使用它)
  2. DB2 目标日志
  3. TCPIP 和 z/OS 连接地址空间(如果是 z/os)。 BAQ 地区 ? (不确定这是否只是我的网站)
  4. 防火墙 - 我知道您的连接正常,但最好还是检查一下明显的情况

正如您所指出的,如果没有错误消息,就很难知道从哪里开始

【讨论】:

  • 1.它连续运行,因为它继续尝试连接,但从未真正连接或出错。 2. 它是一个 DB2 数据库。 3. 不幸的是,我不知道如何检查。如果您碰巧对此有任何指导,将不胜感激。我试图确保不是防火墙允许该端口,但没有看到任何变化。
  • 听起来像是一个 unix DB2 LUW 数据库。在这种情况下,我会检查目标上的 db2diag.log 文件,看看是否有任何消息作为起点出现,只是为了查看连接字符串是否命中数据库。应用程序通常不会不断尝试连接——它们通常会等待响应——你的应用程序是在消耗 CPU 周期还是只是在等待?
  • 耻辱,我没有解决方案,只是确认易失性问题。我刚刚尝试使用 Jupyter Notebook 来管理我的远程 DB2 服务器。 Jupyter 的内核在我所有的试验中都崩溃了。然后我使用 ibm_db 直接从 ipython3 尝试了几次。它似乎只有一次连接,但分配的 conn 对象是一个基本的 python 对象,绝对不是连接。使用 ibm_db2_dbi 连接了很长时间后的第三次运行,比我通过 Squirrel、DB2 CLI 或 Perl 连接的时间要长得多。服务器端的 db2diag.log 中没有任何相关内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多