--[[ 使用方法: 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 Proxy 就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用 lua 脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。...
- 连接池实现:Atlas实现了真正意义上的连接池,可有效管理MySQL连接,减少连接开销。 - 锁机制优化:通过优化锁机制,Atlas性能提高了数十倍。 4. 使用场景 Atlas作为一个中间件,能够将应用程序和MySQL数据库之间...
例如,连接池是MySQL Proxy中的一个重要概念,它为数据库连接提供了一个缓冲池,所有应用程序都可以共享这些连接,从而减少了频繁创建和销毁连接的开销。 MySQL Proxy的一个显著优点是其高度的可移植性和可扩展性。...
Atlas Server 使用连接池来管理与数据库 Server 的连接,每个连接池都维护了多个连接,以便于负载均衡。 Atlas Server 会根据负载均衡策略选择合适的连接发送 SQL 语句。 知识点四:性能优化策略 Atlas 的性能...
6. **高可用性**:虽然单个 MySQL Proxy 服务器可能会成为单点故障,但是可以通过设置多个代理实例并配置客户端连接池来实现冗余,确保系统的可靠性。 7. **优点与局限性**:MySQL Proxy 提供了灵活性和可扩展性,...
它对应用程序屏蔽了 DB 的细节,同时为了降低 MySQL 负担,它还维护了连接池。 Atlas 的一些新特性包括: 1. 主库宕机不影响读主库宕机,Atlas 自动将宕机的主库摘除,写操作会失败,读操作不受影响。 2. 通过...
Jan Kneschke在《MySQL Proxy learns R/W Splitting》中详细的介绍了这种技巧以及连接池问题: 为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。...
此外,根据业务需求,可能还需要调整读写分离策略,例如基于负载动态调整连接池大小,或者使用更复杂的脚本来实现自定义的路由规则。 总结,MySQL Proxy在Ubuntu 10上的读写分离部署涉及到Lua环境的安装、MySQL ...
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。...
###一、简介Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护...实现了真正意义上的连接池4.优化了锁机制,性能提高数十倍###三、Atlas详细说明###四、Atlas的需求及Bug反馈方式如果用户在实际的应用场景中对Atl
`OpenResty`还提供了丰富的`Lua`库,如`ngx_lua`模块,用于HTTP请求处理、缓存管理和连接池管理等。 **3. lapis架构与核心概念** - **路由**:`lapis`使用简洁的API定义路由,可以轻松地根据URL路径、HTTP方法来...
2. 高性能API接口:OpenResty提供了一系列C语言实现的API接口,可以方便地调用Nginx的内部功能,如连接池管理、HTTP请求处理等。 3. 完善的生态:OpenResty拥有丰富的第三方模块,如lua-nginx-module用于扩展Nginx...
6. **性能优化与调试**:学习如何优化OpenResty的性能,包括Lua脚本的优化、内存管理、连接池设置等。同时,了解如何使用 ngx.log 和其他工具进行调试。 7. **错误处理与日志**:掌握OpenResty的错误处理机制,如何...
- **真正的连接池**: 实现了一个真正的连接池机制,确保连接的有效复用,减少了资源消耗和延迟。 - **锁机制优化**: 通过优化锁机制,Atlas能够显著提升并发性能,据称性能提升可达数十倍。 - **高可用性增强**: 在...
2. **连接池管理**:自动维护连接池,减少TCP连接的创建和销毁,提高性能并降低服务器负载。 3. **HTTP/1.1和HTTP/2支持**:支持最新的HTTP/2协议,提供更高效的多路复用。 4. **完整的请求和响应处理**:包括设置...
8. **连接池**:客户端可以使用连接池管理与Redis服务器的连接,提高效率,避免频繁创建和销毁连接带来的开销。 以上就是Redis的基本安装步骤和核心特性。通过熟练掌握这些知识,你可以有效地利用Redis来提升应用...
- **连接池**:没有专门的连接池概念,每个客户端连接独立对应后端MySQL的一个连接。 - **技术支持**:主要依靠官方论坛等社区支持。 - **多核多CPU支持**:虽然支持多核环境,但在实际使用中可能无法充分利用多核或...