srvMysql.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. local skynet = require "skynet"
  2. local mysql = require "mysql"
  3. local lib_logger = require("log.lib_logger")
  4. local confConn, connCount = ...
  5. local logger
  6. local connPool = {}
  7. local connectCount = 0 -- 当前链接数
  8. local queryTimes = 0 -- 查询次数
  9. local createConnectTimes = 0 -- 创建链接次数
  10. local closeConnectTimes = 0 -- 关闭链接次数
  11. local function disconnect(db)
  12. connectCount = connectCount - 1
  13. local ok, rs = pcall(db.disconnect, db)
  14. if not ok then
  15. logger:error("disconnect error %s", rs)
  16. else
  17. closeConnectTimes = closeConnectTimes + 1
  18. logger:debug("disconnect success")
  19. end
  20. end
  21. local function acquire()
  22. if #connPool < 1 then
  23. logger:warn("mysql maybe busy connectCount %d !!!", connectCount)
  24. local ok, db = pcall(mysql.connect, confConn)
  25. createConnectTimes = createConnectTimes + 1
  26. if not ok then
  27. logger:error("mysql connect error %s", db or "null")
  28. return
  29. end
  30. db:query("set names utf8")
  31. connectCount = connectCount + 1
  32. return db
  33. end
  34. return table.remove(connPool, 1)
  35. end
  36. local function release(db)
  37. -- 链接池保持10个
  38. if #connPool > 10 then
  39. disconnect(db)
  40. return
  41. end
  42. table.insert(connPool, db)
  43. end
  44. local function try_query(...)
  45. local db = acquire()
  46. if not db then
  47. return false
  48. end
  49. local sql = ...
  50. -- 可能已经断开连接,先设置下字符集
  51. db:query("set names utf8")
  52. local ok, rs = pcall(db.query, db, ...)
  53. if not ok then
  54. disconnect(db)
  55. logger:error("try query sql %s error %s", sql, rs or "null")
  56. return false
  57. end
  58. release(db)
  59. return rs
  60. end
  61. local function query(...)
  62. local db = acquire()
  63. local sql = ...
  64. if not db then
  65. return false
  66. end
  67. -- 可能已经断开连接,先设置下字符集
  68. db:query("set names utf8")
  69. local ok, rs = pcall(db.query, db, ...)
  70. if not ok then
  71. disconnect(db)
  72. logger:error("query sql %s error %s", sql, rs or "null")
  73. return try_query(...)
  74. end
  75. release(db)
  76. return rs
  77. end
  78. local CMD = {}
  79. function CMD.query(...)
  80. queryTimes = queryTimes + 1
  81. return query(...)
  82. end
  83. function CMD.exit()
  84. for k, db in ipairs(connPool) do
  85. disconnect(db)
  86. end
  87. end
  88. local function init_mysql(cf, num)
  89. num = num or 5
  90. cf = cjson_decode(cf)
  91. confConn = cf
  92. connectCount = num
  93. logger = lib_logger:new("mysql")
  94. skynet.fork(
  95. function(...)
  96. for i = 1, num do
  97. local db = mysql.connect(confConn)
  98. db:query("set names utf8")
  99. table.insert(connPool, db)
  100. end
  101. end
  102. )
  103. skynet.fork(
  104. function(...)
  105. while true do
  106. skynet.sleep(5 * 60 * 100)
  107. logger:debug(
  108. "mysql 5 mins query[%s] create[%s] close[%s]",
  109. tostring(queryTimes),
  110. tostring(createConnectTimes),
  111. tostring(closeConnectTimes)
  112. )
  113. queryTimes = 0
  114. end
  115. end
  116. )
  117. end
  118. skynet.start(
  119. function()
  120. init_mysql(confConn, connCount)
  121. skynet.dispatch(
  122. "lua",
  123. function(session, _, command, ...)
  124. local f = CMD[command]
  125. if session == 0 then
  126. return f(...)
  127. end
  128. skynet.ret(skynet.pack(f(...)))
  129. end
  130. )
  131. end
  132. )