`
leon1509
  • 浏览: 537983 次
  • 性别: 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 Proxy 实现mysql读写分离.pdf

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

    linux运维学习笔记:Mysql中间件Atlas读写分离原理与实战.pdf

    - 连接池实现:Atlas实现了真正意义上的连接池,可有效管理MySQL连接,减少连接开销。 - 锁机制优化:通过优化锁机制,Atlas性能提高了数十倍。 4. 使用场景 Atlas作为一个中间件,能够将应用程序和MySQL数据库之间...

    数据库集群中间件MySQL Proxy探讨.pdf

    例如,连接池是MySQL Proxy中的一个重要概念,它为数据库连接提供了一个缓冲池,所有应用程序都可以共享这些连接,从而减少了频繁创建和销毁连接的开销。 MySQL Proxy的一个显著优点是其高度的可移植性和可扩展性。...

    高性能MySQL中间件Atlas.pdf

    Atlas Server 使用连接池来管理与数据库 Server 的连接,每个连接池都维护了多个连接,以便于负载均衡。 Atlas Server 会根据负载均衡策略选择合适的连接发送 SQL 语句。 知识点四:性能优化策略 Atlas 的性能...

    MysqlProxy实现mysql读写分离[整理].pdf

    6. **高可用性**:虽然单个 MySQL Proxy 服务器可能会成为单点故障,但是可以通过设置多个代理实例并配置客户端连接池来实现冗余,确保系统的可靠性。 7. **优点与局限性**:MySQL Proxy 提供了灵活性和可扩展性,...

    mysql中间件研究(Atlas_cobar_TDDL)

    它对应用程序屏蔽了 DB 的细节,同时为了降低 MySQL 负担,它还维护了连接池。 Atlas 的一些新特性包括: 1. 主库宕机不影响读主库宕机,Atlas 自动将宕机的主库摘除,写操作会失败,读操作不受影响。 2. 通过...

    mysql 读写分离(基础篇)

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

    Ubuntu10下如何搭建MySQL Proxy读写分离探讨

    此外,根据业务需求,可能还需要调整读写分离策略,例如基于负载动态调整连接池大小,或者使用更复杂的脚本来实现自定义的路由规则。 总结,MySQL Proxy在Ubuntu 10上的读写分离部署涉及到Lua环境的安装、MySQL ...

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

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

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

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

    lapis:用MoonScript编写的Lua和OpenResty的Web框架

    `OpenResty`还提供了丰富的`Lua`库,如`ngx_lua`模块,用于HTTP请求处理、缓存管理和连接池管理等。 **3. lapis架构与核心概念** - **路由**:`lapis`使用简洁的API定义路由,可以轻松地根据URL路径、HTTP方法来...

    openresty-1.11.2.4-win32

    2. 高性能API接口:OpenResty提供了一系列C语言实现的API接口,可以方便地调用Nginx的内部功能,如连接池管理、HTTP请求处理等。 3. 完善的生态:OpenResty拥有丰富的第三方模块,如lua-nginx-module用于扩展Nginx...

    OpenResty技能图谱.rar

    6. **性能优化与调试**:学习如何优化OpenResty的性能,包括Lua脚本的优化、内存管理、连接池设置等。同时,了解如何使用 ngx.log 和其他工具进行调试。 7. **错误处理与日志**:掌握OpenResty的错误处理机制,如何...

    数据库中间件Atlas

    - **真正的连接池**: 实现了一个真正的连接池机制,确保连接的有效复用,减少了资源消耗和延迟。 - **锁机制优化**: 通过优化锁机制,Atlas能够显著提升并发性能,据称性能提升可达数十倍。 - **高可用性增强**: 在...

    resty.http资源

    2. **连接池管理**:自动维护连接池,减少TCP连接的创建和销毁,提高性能并降低服务器负载。 3. **HTTP/1.1和HTTP/2支持**:支持最新的HTTP/2协议,提供更高效的多路复用。 4. **完整的请求和响应处理**:包括设置...

    redis安装包

    8. **连接池**:客户端可以使用连接池管理与Redis服务器的连接,提高效率,避免频繁创建和销毁连接带来的开销。 以上就是Redis的基本安装步骤和核心特性。通过熟练掌握这些知识,你可以有效地利用Redis来提升应用...

    Amoeba-art.pdf

    - **连接池**:没有专门的连接池概念,每个客户端连接独立对应后端MySQL的一个连接。 - **技术支持**:主要依靠官方论坛等社区支持。 - **多核多CPU支持**:虽然支持多核环境,但在实际使用中可能无法充分利用多核或...

Global site tag (gtag.js) - Google Analytics