背景
需要查询hue的某表进行币价表进行币价折合,日志显示新建了大量的会话,当前的网站只有已通过每日写入一次MySQL处理连接impala连接时间长的问题,和反复新建会话现象不一致。
排查原因
1、在settings.py文件夹中可以得知impala每一次新建的是cursor对象。而timeout参数只是用于起始连接,对于连接后查询是不做限制的。
conn_impala = connect(host='xxx',
port=xxx,
auth_mechanism='noSasl',
user='xxx',
password='',
database='xxx',
timeout=60)
cur_impala = conn_impala.cursor(user='xxx')
2、查看cursor的源码,可以得知cursor是默认不关闭的,需要手动调用close()方法否则会一直保持连接。
def __init__(self):
self._closed = False
def __del__(self):
if self._closed:
return
try:
self.close_operation()
except Exception:
pass
try:
self.session.close()
except Exception:
pass
3、然后是这一个位置
继承关系 Base《= BaseAPI《= BehaviorBase
class Base(SessionMixin, RequestHandler):
def initialize(self) -> None:
self.sess = self.settings['sess']
self.cur_impala = self.settings['cur_impala']
class BehaviorBase(BaseAPI):
def initialize(self):
super().initialize()
self.app_config = {1: 'aaaa', 14: 'bbbb'}
self.platform_config = {2: 'cc', 3: 'dd', 5: "ee", 6: "ff"}
当每一次调用BehaviorBase的时候就会一直新建cursor,并且一直保持连接但是没有做实质的操作。
总结
- 复用的应该是链接而不是cursor。
- 记得用完链接以后一定要close()。
- 但是不要频繁的新建连接,连接数太多会慢,所以是需要的时候才新建,新建完就close掉。
但是
一个分区为当天count(*)=250的一个SQL语句为什么会有的时候3min?
SELECT
dt,
f_currency_display,
f_usdt
FROM xxx.xxx
WHERE dt = '{arrow.get(end).format("YYYYMMDD")}'
AND f_usdt != 'f_usdt'