`
leon1509
  • 浏览: 528414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lua Mysql连接池

 
阅读更多
--[[
    使用方法:

    local mysql = require "mysql_pool"

    local ret, res, sqlstate = mysql:query(sql, true);
    local tmp
    if ret then
        tmp = cjson.encode(res)
    else
        ngx.say("error")
    end
--]]

--[[
注意事项:
1. 启用连接池需要开启 lua_code_cache on
2. 测试连接池时,线程数需要小于set_keepalive中的第二个参数(即连接数)
3. 根据程序里的SQL情况,设置set_timeout为适当的值(即连接超时??)
--]]

module("mysql_pool", package.seeall)
local mysql = require("resty.mysql")
local cfg = require "youngyedu.common.resources.config"

local mysql_pool = {}

--[[
    先从连接池取连接,如果没有再建立连接.
    返回:
        false,出错信息.
        true,数据库连接
--]]
function mysql_pool:get_connect()
    if ngx.ctx[mysql_pool] then
        return true, ngx.ctx[mysql_pool]
    end

    local client, errmsg = mysql:new()
    if not client then
        return false, "mysql.socket_failed: " .. (errmsg or "nil")
    end

    client:set_timeout(10000)  --30秒

    local options = {
        host = cfg.db.prod.HOST,
        port = cfg.db.prod.PORT,
        user = cfg.db.prod.USER,
        password = cfg.db.prod.PASSWORD,
        database = cfg.db.prod.DATABASE
    }

    local result, errmsg, errno, sqlstate = client:connect(options)
    if not result then
        return false, "mysql.cant_connect: " .. (errmsg or "nil") .. ", errno:" .. (errno or "nil") ..
                ", sql_state:" .. (sqlstate or "nil")
    end

    local query = "SET NAMES " .. "utf8"
    local result, errmsg, errno, sqlstate = client:query(query)
    if not result then
        return false, "mysql.query_failed: " .. (errmsg or "nil") .. ", errno:" .. (errno or "nil") ..
                ", sql_state:" .. (sqlstate or "nil")
    end

    ngx.ctx[mysql_pool] = client

    -- 测试,验证连接池重复使用情况
    --[[ comments by leon1509
    local count, err = client:get_reused_times()
    ngx.say("xxx reused times" .. count);
    --]]

    return true, ngx.ctx[mysql_pool]
end

--[[
    把连接返回到连接池
    用set_keepalive代替close() 将开启连接池特性,可以为每个nginx工作进程,指定连接最大空闲时间,和连接池最大连接数
 --]]
function mysql_pool:close()
    if ngx.ctx[mysql_pool] then
        -- 连接池机制,不调用 close 而是 keeplive 下次会直接继续使用
        -- lua_code_cache 为 on 时才有效
        -- 60000 : pool_max_idle_time , 100:connections
        ngx.ctx[mysql_pool]:set_keepalive(60000, 80)
        -- 调用了 set_keepalive,不能直接再次调用 query,会报错
        ngx.ctx[mysql_pool] = nil
    end
end

--[[
    查询
    有结果数据集时返回结果数据集
    无数据数据集时返回查询影响
    返回:
        false,出错信息,sqlstate结构.
        true,结果集,sqlstate结构.
--]]
function mysql_pool:query(sql, flag)
    local ret, client = self:get_connect(flag)
    if not ret then
        return false, client, nil
    end

    local result, errmsg, errno, sqlstate = client:query(sql)

    while errmsg == "again" do
        result, errmsg, errno, sqlstate = client:read_result()
    end

    self:close()

    if not result then
        errmsg = "mysql.query_failed:" .. (errno or "nil") .. (errmsg or "nil")
        return false, errmsg, sqlstate
    end

    return true, result, sqlstate
end

return mysql_pool

 

分享到:
评论

相关推荐

    mysql 读写分离(基础篇)

     Jan Kneschke在《MySQL Proxy learns R/W Splitting》中详细的介绍了这种技巧以及连接池问题:  为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。...

    MySQL的使用中实现读写分离的教程

    MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。...

    Atlas:一个高性能稳定的 MySQL 代理

    ###一、简介Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护...实现了真正意义上的连接池4.优化了锁机制,性能提高数十倍###三、Atlas详细说明###四、Atlas的需求及Bug反馈方式如果用户在实际的应用场景中对Atl

    数据库中间件Atlas

    Atlas是基于mysql-proxy • 主流程中的Lua脚本用C重写 ...• 实现了“真正意义”上的连接池,真正连接复用 • 优化了锁机制,性能提高数十倍 • 官方mysql-proxy主库宕机从库亦不可用,Atlas优化为可读不可写

    仿照QQ的java源码-Atlas:MySQL的高性能稳定代理,由奇虎DBA和基础设施团队开发

    仿照QQ的java源码我们已经建立了另一个有趣的项目。...3.实现连接池。 4.优化锁定机制,性能大幅提升。 4.Atlas详细说明 5.需求与反馈 如果您在生产环境中对 Atlas 有新的功能需求,或者在使用 Atlas 的

    开涛高可用高并发-亿级流量核心技术

    12.2.2 HttpClient连接池源码分析 240 12.2.3 HttpClient 4.2.3配置 241 12.2.4 问题示例 243 12.3 线程池 244 12.3.1 Java线程池 245 12.3.2 Tomcat线程池配置 248 13 异步并发实战 250 13.1 同步阻塞调用 251 13.2...

    通用网络游戏通讯平台

    Center Server 中包含基于用户的数据存储池、LUA 状态 机,并提供逻辑脚本对 MySQL 数据库的操作能力。同时,Center Server 中包含一个嵌入式的 WebServer,用于服务器状态的查看、控制,也可以作为普通的 WebServer ...

    物联网平台源码适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等.zip

    系统监控: 操作日志、登录日志、系统日志、在线用户、服务监控、连接池监控、缓存监控等 产品管理: 产品、产品物模型、产品分类、产品固件、设备授权码等 设备管理: 控制、分组、定时、日志、统计、定位、分享、配置...

    基于springboot的在线聊天系统源码+项目说明.zip

    HikariCP | 数据库连接池 | https://github.com/brettwooldridge/HikariCP FastDFS | 对象存储 | https://sourceforge.net/projects/fastdfs/ Nginx | 反向代理服务器 | http://nginx.org/ Netty | 网络编程框架 | ...

    单点登录源码

    Druid | 数据库连接池 | [https://github.com/alibaba/druid](https://github.com/alibaba/druid) FluentValidator | 校验框架 | [https://github.com/neoremind/fluent-validator]...

Global site tag (gtag.js) - Google Analytics