【odoo bug排查】psycopg2.InterfaceError: Cursor already closed

在这里插入图片描述

在这里插入图片描述

错误日志


Traceback (most recent call last):File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/api.py", line 983, in getcache_value = field_cache[record._ids[0]]
KeyError: 3During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/fields.py", line 1132, in __get__value = env.cache.get(record, self)File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/api.py", line 990, in getraise CacheMiss(record, field)
odoo.exceptions.CacheMiss: 'im.auto.test.api(3,).code'During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/api_server/handler.py", line 110, in handle_requestresult = f(self, *args, **kwargs, context=context)File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/api_server/decorator.py", line 506, in wrapperres = function(*args, **kwargs)File "/Users/mzwang/Documents/codes/python/im_test_system/addons/im_pressure/api/api_auto_test_api.py", line 109, in ts_api_im_auto_test_api_listtotal, data = auto_test_api_obj.list_auto_test_api_func(File "/Users/mzwang/Documents/codes/python/im_test_system/addons/im_pressure/models/im_auto_test_api_model.py", line 216, in list_auto_test_api_funcreturn total, [File "/Users/mzwang/Documents/codes/python/im_test_system/addons/im_pressure/models/im_auto_test_api_model.py", line 218, in <listcomp>"code": model.code,File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/fields.py", line 1158, in __get__recs._fetch_field(self)File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/models.py", line 3157, in _fetch_fieldself._read(fnames)File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/models.py", line 3234, in _readcr.execute(query_str, params + [sub_ids])File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/sql_db.py", line 312, in execute_logger.debug("query: %s", self._format(query, params))File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/sql_db.py", line 303, in _formatencoding = psycopg2.extensions.encodings[self.connection.encoding]File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/sql_db.py", line 470, in __getattr__return getattr(self._obj, name)File "/Users/mzwang/Documents/codes/python/im_test_system/odoo/sql_db.py", line 469, in __getattr__raise psycopg2.InterfaceError("Cursor already closed")
psycopg2.InterfaceError: Cursor already closed
2024-04-16 09:48:32,253 94676 DEBUG im_test_system_dev odoo.sql_db: SUM from:0:00:00/0 [201] 

突然出现的项目bug,之前做的模块都没有出现这种情况,新增了一个基础接口模块,突然蹦出来,而且报错及其不稳定,有时候可以刷新,有时候连续几次都没有报错。但一定会出现就是了。

解决思路:

1. 看日志定位问题是什么
2. 发现日志有两处error,一一排查,第一个是odoo 缓存,第二个是pg cursor
3. 浪费了一下午的时间发现第一个缓存不是根本原因,只是因为之前就遇到过这个缓存问题,导致第一时间排查此
4. 继续排查第二个问题。
5. 报错信息为:psycopg2.InterfaceError: Cursor already closed 报错现象为单接口请求没问题,前端多个接口一起并发请求就会报错。所以第一时间想到的就是多线程情况下数据库连接异常关闭。
6. 测试定位排除:- 优先排除前端问题- 更换数据库,将本地数据库替换为测试环境的,依旧出现(排除odoo升级数据库异常)- 更换模块查询,没有问题(此时因为没有能发现稳定复现的机制,所以这个并没有什么意义)- 替换报错代码,注释掉则不会报错,替换函数内orm操作,发现也会出现异常。于是替换逻辑,仅用 time.sleep 模拟耗时,报错频率增加。(更加怀疑是odoo 本身的问题)
7. 向自己怀疑的目标前进,开始扒源码,看odoo对数据库连接的实现。
8. 打印日志,打印线程号打印cr对象。
9. 发现在出现异常的情况下,都会有数据库连接被释放。尝试在列表页接口添加 time.sleep ,竟然可以稳定复现报错。于是猜测是在并发执行过程中,A请求执行线程并没有完全释放掉cr,后一个B请求就已经拿到了同一个cr,如果B中存在耗时操作,A请求此时释放cr,B耗时操作完成着执行数据库查询,就会发现cr对象已经被释放。出现报错:psycopg2.InterfaceError: Cursor already closed

如何解决

1. 每个线程拿到的cr数据库连接,都应该是不同的才对使用线程锁(Thread Lock): 在访问 cr 之前,可以使用线程锁来确保一次只有一个线程可以获取到 cr。这样可以防止多个线程同时操作 cr,从而避免数据竞争和不一致性。为每个线程创建独立的数据库连接和游标: 可以为每个线程创建独立的数据库连接和游标,这样每个线程都可以独立地操作数据库,不会影响其他线程的操作。这种方法可以确保并发性,但也会增加数据库连接和资源的开销。使用连接池(Connection Pool): 可以使用连接池来管理数据库连接,确保每个线程获取到的连接都是唯一的。连接池可以控制并发访问数据库的数量,以及确保连接的复用和有效性。这样可以避免因为连接过多而导致数据库性能下降,同时也可以减少连接的创建和销毁开销。使用数据库事务(Database Transaction): 在需要操作数据库的地方,可以使用数据库事务来确保一系列操作的原子性和一致性。这样可以在一次事务中执行多个操作,并确保这些操作要么全部成功,要么全部失败,从而避免数据的不一致性。使用线程局部存储(Thread Local Storage,TLS):在每个线程中维护一个独立的数据库连接对象。Python 提供了 threading.local() 类来实现线程局部存储,你可以在每个线程中创建一个独立的数据库连接对象,并在处理请求时使用该对象。这样可以确保每个线程使用的是独立的数据库连接,避免了多个线程之间的竞争和冲突。使用连接池(Connection Pool):连接池是一种管理数据库连接的机制,它会在应用程序启动时创建一定数量的数据库连接,并将它们保存在一个池中。每个线程需要使用数据库连接时,可以从连接池中获取一个连接,并在使用完毕后将其放回连接池。这样可以避免多个线程同时使用同一个连接,提高了数据库连接的复用性和效率。使用同步机制:在获取数据库连接时使用同步机制(如互斥锁)来确保只有一个线程可以获取连接,其他线程需要等待。这样可以避免多个线程同时获取同一个连接,但会影响性能。使用数据库连接的上下文管理器:在使用数据库连接时,可以通过上下文管理器来确保连接在使用完毕后被正确关闭。Python 中的 with 语句可以很方便地实现这一点,确保在退出 with 块时自动关闭连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019024.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一分钟教你学浪app视频怎么缓存

你是否在学浪app上苦苦寻找如何缓存视频的方法&#xff1f;你是否想快速、轻松地观看自己喜欢的视频内容&#xff1f;那么&#xff0c;让我们一起探索一分钟教你如何缓存学浪app视频的技巧吧&#xff01; 学浪下载工具我已经打包好了&#xff0c;有需要的自己下载一下 学浪下…

[QNX] BSP 网络性能优化:调优io-pkt和ClockPeriod提升网速

0 概要 本文介绍如何在QNX系统上优化网络性能&#xff0c;主要通过调整io-pkt和ClockPeriod参数来实现。通过优化&#xff0c;网络吞吐量可以得到显著提升。 1 优化方法 1.1 调整io-pkt的mclbytes参数: io-pkt是QNX系统中常用的网络协议栈&#xff0c;其mclbytes参数指定了…

如何安全可控地进行内外网跨网络传输文件?

跨网络传输文件通常指的是在不同的网络环境之间移动数据&#xff0c;这在现代企业运营中非常常见。随着网络技术的高速发展&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;企业一般会采用内外网隔离的策略。在进行内外网跨网络传输文件时&#xff0c;需要考虑多种因…

微软exchange邮箱发送

使用java发送exchange类型的邮件&#xff0c;foxmail中配置如下图&#xff1a; 需要的maven依赖如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

报表控件Stimulsoft在JavaScript报告工具中的事件:查看器事件(下)

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

解决ModuleNotFoundError: No module named ‘skfuzzy‘,这个库全名可不叫skfuzzy哦,否则直接报错!!

ModuleNotFoundError: No module named skfuzzy 在这里插入图片描述在这里插入图片描述如何解决 ModuleNotFoundError: No module named skfuzzy 的问题&#xff1f;skfuzzy 模块介绍什么是模糊C均值聚类&#xff1f;skfuzzy 的应用如何使用 skfuzzy 进行模糊聚类 结论 如何解决…

想要品质飞跃?找六西格玛培训公司就对了!

在当今复杂多变的市场环境中&#xff0c;企业的竞争早已不再是单一的价格或产品竞争&#xff0c;而是转向了对品质、效率和创新的全面追求。六西格玛&#xff0c;作为一种全球公认的质量管理方法论&#xff0c;正成为越来越多企业追求品质革命的重要工具。在这其中&#xff0c;…

不盖CNAS的证书就是无效的?证书哪些信息是“非必要”?

做设备校准的企业&#xff0c;大多数都是为了拿到仪器校准证书&#xff0c;而说起校准证书&#xff0c;很多人优先就是想到CNAS&#xff0c;CNAS作为校准行业重要的核心资质&#xff0c;无论是校准机构实力的证明&#xff0c;还是满足企业年审的需要&#xff0c;基本上都是关键…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…

武汉星起航:跨境电商平台拓展全球市场,打造国际品牌的更优选择

随着全球化的加速和互联网的普及&#xff0c;跨境电商平台与国内电商平台成为了现代商业领域的两大重要支柱。它们在商业模式、运营策略、市场覆盖等方面均呈现出显著的区别&#xff0c;为商家提供了多样化的销售渠道和市场拓展机会。武汉星起航旨在深入探讨跨境电商平台与国内…

零门槛副业兼职!10种长期赚钱好方法!

想要实现财务自由&#xff0c;不能仅停留在梦想层面&#xff0c;更需要付诸实践。 以下是我从网络上精心整理的十大可靠的兼职副业建议&#xff0c;旨在助你一臂之力。 这些项目已根据推荐程度、难度水平、目标人群以及预期收入进行了细致分类。 我要强调的是&#xff0c;任…

神秘的Python-docx,自动化你的Word文档处理

在Python里&#xff0c;有一个非常实用的库叫做python-docx。它允许我们像操作文本文件一样&#xff0c;轻松地创建和修改Word文档。如果你经常需要处理Word文件&#xff0c;比如生成报告或自动填充数据&#xff0c;学习如何使用python-docx库将大大提升你的工作效率。 python…

苹果删除的短信怎么恢复?这里有4个恢复技巧

手机短信已成为我们日常沟通中不可或缺的一部分&#xff0c;其中包含了与家人、朋友的温馨对话&#xff0c;以及与工作伙伴的重要信息。然而&#xff0c;有时我们可能会因为误操作或其他原因不小心删除了重要的短信。请别担心&#xff0c;本文将为您详细介绍删除的短信怎么恢复…

平滑 3d 坐标

3d平滑 import torch import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dclass SmoothOperator:def smooth(self, vertices):# 使用一维平均池化进行平滑vertices_smooth F.avg_pool1d(vertices.p…

自动控制原理MATLAB:系统分析

控制系统时域分析 &#xff08;1&#xff09;稳定性分析 稳定是控制系统的重要性能&#xff0c;也是系统设计过程中的首要问题。线性系统稳定的充分必要条件是&#xff1a;闭环系统特征方程的所有根均具有负实部。在MATLAB中可以调用roots命令求取特征根&#xff0c;进而判别…

C# 和 Qt 相比的一些优势

C# 和 Qt 都是流行的软件开发工具&#xff0c;它们各自具有不同的优势&#xff0c;适用于不同的开发场景。以下是 C# 和 Qt 相比的一些优势。相比之下&#xff0c;Qt 也有其独特的优势&#xff0c;特别是在跨平台 GUI 应用程序开发方面。然而&#xff0c;C# 的这些优势使得它在…

【编码利器 —— BaiduComate】

目录 1. 智能编码助手介绍 2. 场景需求 3. 功能体验 3.1指令功能 3.2插件用法 3.3知识用法 3.4自定义配置 4. 试用感受 5. AI编程应用 6.总结 智能编码助手是当下人工智能技术在编程领域的一项重要应用。Baidu Comate智能编码助手作为一款具有强大功能和智能特性的工…

APScheduler定时器使用【简易版】:django中使用apscheduler,使用mysql做存储后端

一、基本环境 python版本&#xff1a;3.8.5 APScheduler3.10.4 Django3.2.7 djangorestframework3.15.1 SQLAlchemy2.0.29 PyMySQL1.1.0二、django基本设置 2.1、新增一个app 该app用来写apscheduler相关的代码 python manage.py startapp gs_scheduler 2.2、修改配置文件s…

20232810 2023-2024-2 《网络攻防实践》实验八

一、实践内容 1.1 恶意代码 1.1.1 简介 定义&#xff1a;恶意代码&#xff08;Malware,或Malicious Code&#xff09;指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。 指令集合&#xff1a;二进制执行文件、脚本语言代码、宏代码、寄生在文件或者启动扇区的指令…

想要买到心仪的旋转式孔板流量计吗?

选择旋转式孔板流量计可不能云里雾里的乱选择呀&#xff0c;煤矿对产品质量要求很严格的。所以我们要先了解产品的再决定才是对的选择。 旋转式孔板流量计技术参数【1--5--9】 规格&#xff1a;DN15&#xff5e;DN1000 孔径比(βd/D)&#xff1a;β0&#xff0e;2—0&#xff…