0

我正在尝试使用 mysql-proxy 实现连接池(许多客户端由几个数据库连接提供服务)。

我看了一下 ro-pooling.lua,似乎必须在 connect_server() 钩子中完成一些操作。

如果我想创建一个新连接:

  1. 将目标后端索引分配给proxy.connection.backend_ndx.
  2. 什么都不退

如果我想使用已经存在的空闲连接:

  1. 将目标后端索引分配给proxy.connection.backend_ndx.
  2. 返回proxy.PROXY_IGNORE_RESULT

现在,困扰我的是从 connect_server() 钩子返回 proxy.PROXY_IGNORE_RESULT 似乎对连接重用没有影响 - 每次客户端连接时,都会创建一个新连接,最终我遇到以下错误:“用户'用户名'已超过'max_user_connections' 资源(当前值:4)“

那么,问题来了:in hook是什么意思?return proxy.PROXY_IGNORE_RESULTconnect_server()

此外,任何关于 mysql-proxy 如何创建和重用连接的参考都会非常有帮助——我没有找到任何...

任何帮助将不胜感激 :)

编辑:

这是我当前使用的脚本的来源:

local default_backend = 1
local min_idle_connections = 1 
local max_idle_connections = 4
local connections_limit = 1
local user_name = "user"

if not proxy.global.count then -- never mind this, not using it...
    proxy.global.count = 0
end

function connect_server()

    local backend  = proxy.global.backends[1]
    local pool = backend.pool
    local cur_idle = pool.users[""].cur_idle_connections
    print ("CONNECT SERVER:")
    print("current backend:" ..proxy.connection.backend_ndx)
    if cur_idle >= min_idle_connections then
        print("using pooled connection")
        proxy.connection.backend_ndx=0
        print("current backend:" ..proxy.connection.backend_ndx)
        return proxy.PROXY_SEND_RESULT
    end
    proxy.global.count = proxy.global.count + 1
    print("Creating new connection")
    proxy.connection.backend_ndx = default_backend
    print("current backend:" ..proxy.connection.backend_ndx)

end

function read_handshake()
    print("READ_HANDSHAKE")
    print("current backend:" ..proxy.connection.backend_ndx)

end

function read_auth()
    local username = proxy.connection.client.username
    print("READ_AUTH: " ..username)
    print("current backend:" ..proxy.connection.backend_ndx)

end

function disconnect_client()
    print ("DISCONNECT CLIENT. ")
    print("current backend:" ..proxy.connection.backend_ndx)

end

function read_auth_result(auth)
        print("READ_AUTH_RESULT")
        if auth.packet:byte() == proxy.MYSQLD_PACKET_OK then
            --auth was fine, disconnect from the server--
            proxy.connection.backend_ndx = 0
            print("disconnected backend after auth")
            print("current backend:" ..proxy.connection.backend_ndx)
        end
end

function read_query(packet)
    print("READ_QUERY:")
    print("current backend:" ..proxy.connection.backend_ndx)

if packet:byte() == proxy.COM_QUIT then
        print("received signal QUIT")
         proxy.response = {
             type = proxy.MYSQLD_PACKET_OK,
         }
        return proxy.PROXY_SEND_RESULT
    end

    if proxy.connection.backend_ndx == 0 then
        print("assigning backend to process query...")
        proxy.connection.backend_ndx = default_backend
        print("current backend:" ..proxy.connection.backend_ndx)

    end

    local username = proxy.connection.client.username
     local cur_idle = proxy.global.backends[default_backend].pool.users[username].cur_idle_connections
     print ("current idle user" ..username.." connections: " ..cur_idle)
    if string.byte(packet) == proxy.COM_QUERY then
         print("Query: " .. string.sub(packet, 2))

    end
    proxy.queries:append(1, packet)
    return proxy.PROXY_SEND_QUERY
end

 function read_query_result( inj )
    print("READ_QUERY_RESULT:")
    print("current backend:" ..proxy.connection.backend_ndx)
     local res = assert(inj.resultset)
        local flags = res.flags

        if inj.id ~= 1 then
             return proxy.PROXY_IGNORE_RESULT
        end
        is_in_transaction = flags.in_trans

        if not is_in_transaction then
            -- release the backend
            print("releasing backend")
            proxy.connection.backend_ndx = 0
        end
    print("current backend:" ..proxy.connection.backend_ndx)
end
4

0 回答 0