skynet icon indicating copy to clipboard operation
skynet copied to clipboard

skynet mysql.lua query 执行超长文本(16MB)

Open ugpu opened this issue 2 years ago • 3 comments

_compose_query 好像不支持超长文本打包, 比如文本超过16MB strpack(string.pack)会报错, 修改了下 不得行. 是否有其他大佬修改过 有相关案例提供吗?

ugpu avatar Feb 07 '23 06:02 ugpu

如果确实16M限制,可以分开多个字段存储。

terry8210 avatar Feb 07 '23 10:02 terry8210

如果确实16M限制,可以分开多个字段存储。 目前具体情况是这样的, 原有业务的确不应该 insert 如此长的数据. 但是设计已经产生, 业务逻辑升级优化的确是正确做法. 但是目前还是想改动这个 query, 支持 多行/多表数据 一次性投递到 mysql.
根据mysql的协议是支持的: 在源码中 socketchannel.lua channel:request(request, response, padding) 接口 padding就是拆分下来的消息包, 投递到mysql,mysql按照协议分包接收后 执行. 但是我已经拆分了, 且按照mysql的协议 依次在 mysql.lua中使 《self.packet_no》产生了消息ID递增, 重新填装了每个包的大小. 修改案例伪代码如下, 不知道为什么会出错? 现在完全和mysql协议对接不上.

local function _compose_query(self, query) self.packet_no = -1 local cmd_packet = COM_QUERY .. query local package_max_size = 8 * 1024 * 1024 local size = #cmd_packet if size >= package_max_size then

    --拆包处理
    DEBUG("size = ", size)
    DEBUG("package_max_size = ", package_max_size)
    local pack_size = package_max_size
    local rreq = string.sub(cmd_packet, 1, pack_size)
    local ssize = #rreq
    local request_pack = _compose_packet(self, rreq)
    local req_tbl = {}
    table.insert(req_tbl, request_pack)
    size = size - pack_size
    local offset = pack_size
    while true do
        self.packet_no = self.packet_no + 1
        pack_size = package_max_size
        if pack_size > size then
            pack_size = size
        end
        

        rreq = string.sub(cmd_packet, offset + 1, offset + pack_size)
        ssize = #rreq
        rreq = COM_QUERY .. rreq
        table.insert(req_tbl, _compose_packet(self, rreq))
        offset = offset + pack_size

        size = size - ssize
        if size <= 0 then
            DEBUG("END size = ", size)
            break
        end
    end

    return request_pack, req_tbl
end

return _compose_packet(self, cmd_packet)

end

ugpu avatar Feb 07 '23 10:02 ugpu

之前也遇到类似问题, 但这个不太好解决, 和 mysql 的 max_packet_size 等参数要同步 不然 lua 层面设的大, 但 mysql-server 小, 发到mysql那边也会报错。

aceyin avatar Feb 13 '23 08:02 aceyin