`
leon1509
  • 浏览: 527186 次
  • 性别: 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...

    openresty-1.15.8.1-win64.zip

    这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。 OpenResty® 的目标是让你的Web服务...

    通用网络游戏通讯平台

    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