提醒:涉及数据库这类的东西一定需要注意长短链接问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了提醒:涉及数据库这类的东西一定需要注意长短链接问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2714字,纯文字阅读大概需要4分钟。
内容图文
说明昨天下午有同事反映运维平台权限加上去后,但实际没生效,当时简单瞧了一下数据库生效了,但Redis没同步,权限添加到mysql然后会同刷一次Redis。没刷成功,当时由于在忙Ansible API的一些东西,没急着弄。
寻找问题
实际调用类
class Permission(DbBase):
‘‘‘权限认证类操作‘‘‘
def __init__(self):
"""权限认证类
:rtype: object
"""
super(Permission, self).__init__()
self.SESSION_NAME = conf.SESSION_NAME
.....
父类DbBase
需要注意的是这里并没有走继承方法,而是会每次都初始化,当时想的是要继承两个类,所以用实际方法写,这个先不管。有问题后面再改。
class DbBase(object):
‘‘‘数据库基类操作‘‘‘
def __init__(self):
self.mysql = db.Mysql() # instance mysql object
self.redis = db.Redis() # instance redis object
‘‘‘Call Mysql Object methods‘‘‘
self._db_write = self.mysql.write
self._db_fetchone = self.mysql.fetchone
self._db_fetchall = self.mysql.fetchall
‘‘‘Redis Users Session key‘‘‘
self.session_key = "----"
基类
class Redis():
def __init__(self):
parmas = {
‘host‘ : conf.REDIS_HOST,
‘port‘ : conf.REDIS_PORT,
‘password‘ : conf.REDIS_PASS,
}
# 改一下方法, ttl一直获取为-2
self.cursor = redis.Redis(**parmas)
查看代码
1
class Redis(StrictRedis):
"""
Provides backwards compatibility with older versions of redis-py that
changed arguments to some commands to be more Pythonic, sane, or by
accident.
"""
2
看到长连接参数socket_keepalive,看看代码。
class StrictRedis(object):
def __init__(self, host=‘localhost‘, port=6379,
db=0, password=None, socket_timeout=None,
socket_connect_timeout=None,
socket_keepalive=None, socket_keepalive_options=None,
connection_pool=None, unix_socket_path=None,
encoding=‘utf-8‘, encoding_errors=‘strict‘,
charset=None, errors=None,
decode_responses=False, retry_on_timeout=False,
ssl=False, ssl_keyfile=None, ssl_certfile=None,
ssl_cert_reqs=None, ssl_ca_certs=None,
max_connections=None):
3
最终定位到此方法,默认走的是短链接
# TCP_KEEPALIVE
if self.socket_keepalive:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
for k, v in iteritems(self.socket_keepalive_options):
sock.setsockopt(socket.SOL_TCP, k, v)
问题推测
有可能是长短链接的问题,链接失效后再调用会出问题。
代码修改
代码有注释
‘‘‘Redis DB Object‘‘‘
class Redis():
def __init__(self):
# 这里的 socket_keepalive是为长链接,因为后面会很多
# 子类继承这个类,为保持连接的长久性
parmas = {
‘host‘ : conf.REDIS_HOST,
‘port‘ : conf.REDIS_PORT,
‘password‘ : conf.REDIS_PASS,
‘socket_keepalive‘ : True,
}
# 改一下方法, ttl一直获取为-2
self.cursor = redis.Redis(**parmas)
等待观察
提醒:涉及数据库这类的东西一定需要注意长短链接问题
标签:数据库 comm def out -- base fetchone time cal
本文系统来源:http://blog.51cto.com/cwtea/2059730
内容总结
以上是互联网集市为您收集整理的提醒:涉及数据库这类的东西一定需要注意长短链接问题全部内容,希望文章能够帮你解决提醒:涉及数据库这类的东西一定需要注意长短链接问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。