database.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import traceback
  4. import mysql.connector
  5. import mysql.connector.pooling
  6. import redis
  7. from mysql.connector import errorcode
  8. import time
  9. import jimit as ji
  10. from jimvc.models import app_config
  11. from jimvc.models import logger
  12. __author__ = 'James Iter'
  13. __date__ = '16/6/8'
  14. __contact__ = 'james.iter.cn@gmail.com'
  15. __copyright__ = '(c) 2016 by James Iter.'
  16. class Database(object):
  17. cnxpool = None
  18. r = None
  19. def __init__(self):
  20. pass
  21. @classmethod
  22. def init_conn_mysql(cls):
  23. try:
  24. cls.cnxpool = mysql.connector.pooling.MySQLConnectionPool(
  25. host=app_config["db_host"],
  26. user=app_config["db_user"],
  27. password=app_config["db_password"],
  28. port=app_config["db_port"],
  29. database=app_config["db_name"],
  30. raise_on_warnings=app_config["DEBUG"],
  31. pool_size=app_config["db_pool_size"],
  32. charset=app_config["db_charset"]
  33. )
  34. except mysql.connector.Error as err:
  35. if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
  36. e_msg = u'用户名或密码错误'
  37. elif err.errno == errorcode.ER_BAD_DB_ERROR:
  38. e_msg = u'数据库不存在'
  39. else:
  40. e_msg = err.msg
  41. logger.error(e_msg)
  42. exit(err.errno)
  43. @classmethod
  44. def keepalived_mysql(cls):
  45. def ping(label='', _cnxpool=None):
  46. if _cnxpool is None:
  47. logger.critical(''.join(['cnxpool must not None by ', label]))
  48. return
  49. try:
  50. _cnx = _cnxpool.get_connection()
  51. _cnx.ping(attempts=1, delay=0)
  52. except mysql.connector.errors.InterfaceError as err:
  53. logger.critical(err.msg)
  54. except mysql.connector.Error as err:
  55. logger.error(err)
  56. else:
  57. _cnx.close()
  58. while True:
  59. try:
  60. time.sleep(5)
  61. ping(label='', _cnxpool=cls.cnxpool)
  62. except:
  63. logger.error(traceback.format_exc())
  64. @classmethod
  65. def init_conn_redis(cls):
  66. """
  67. * Added TCP Keep-alive support by passing use the socket_keepalive=True
  68. option. Finer grain control can be achieved using the
  69. socket_keepalive_options option which expects a dictionary with any of
  70. the keys (socket.TCP_KEEPIDLE, socket.TCP_KEEPCNT, socket.TCP_KEEPINTVL)
  71. and integers for values. Thanks Yossi Gottlieb.
  72. TCP_KEEPDILE 设置连接上如果没有数据发送的话,多久后发送keepalive探测分组,单位是秒
  73. TCP_KEEPINTVL 前后两次探测之间的时间间隔,单位是秒
  74. TCP_KEEPCNT 关闭一个非活跃连接之前的最大重试次数
  75. """
  76. import socket
  77. cls.r = redis.StrictRedis(host=app_config.get('redis_host', '127.0.0.1'),
  78. port=app_config.get('redis_port', 6379),
  79. db=app_config.get('redis_dbid', 0), decode_responses=True, socket_timeout=5,
  80. socket_connect_timeout=5, socket_keepalive=True,
  81. socket_keepalive_options={socket.TCP_KEEPIDLE: 2, socket.TCP_KEEPINTVL: 5,
  82. socket.TCP_KEEPCNT: 10},
  83. retry_on_timeout=True)
  84. try:
  85. cls.r.ping()
  86. except redis.exceptions.ResponseError as e:
  87. logger.warn(e.message)
  88. cls.r = redis.StrictRedis(host=app_config.get('redis_host', '127.0.0.1'),
  89. port=app_config.get('redis_port', 6379),
  90. db=app_config.get('redis_dbid', 0), password=app_config.get('redis_password', ''),
  91. decode_responses=True, socket_timeout=5,
  92. socket_connect_timeout=5, socket_keepalive=True,
  93. socket_keepalive_options={socket.TCP_KEEPIDLE: 2, socket.TCP_KEEPINTVL: 5,
  94. socket.TCP_KEEPCNT: 10},
  95. retry_on_timeout=True)
  96. cls.r.client_setname(ji.Common.get_hostname())
  97. @classmethod
  98. def keepalived_redis(cls):
  99. while True:
  100. try:
  101. time.sleep(5)
  102. cls.r.ping()
  103. except redis.exceptions.ConnectionError as e:
  104. logger.error(e.message)
  105. cls.init_conn_redis()
  106. except:
  107. logger.error(traceback.format_exc())