You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Prisma存储超1MB图片时遇服务器连接关闭错误求助

问题描述

我尝试用Prisma将图片以Blob形式存储到数据库,Schema里把图片字段定义为Bytes @db.MediumBlob(容量约16MB),小于1MB的图片能正常存储,但超过1MB时调用createMany会触发错误:

Error during image upload: PrismaClientKnownRequestError:
Invalid prisma.vehicle_Images.createMany() invocation:

Server has closed the connection.

相关代码:

const imagesToCreate = [];

for (const file of filesToUpload) {
  console.log(file);
  const fileData = fs.readFileSync(file.filepath);
  imagesToCreate.push({
    image: fileData,
  });
  isFirstImage = false;
}

await prisma.vehicle_Images.createMany({
  data: imagesToCreate,
});
解决方案

1. 调整MySQL的max_allowed_packet参数

MySQL默认的max_allowed_packet通常为1MB,就算字段支持更大存储,超过该值的数据包也会被拒绝。需要修改这个参数:

  • 临时生效:在MySQL命令行执行 SET GLOBAL max_allowed_packet = 16*1024*1024;(设置为16MB,和MediumBlob容量匹配),重启MySQL后失效。
  • 永久生效:修改MySQL配置文件(如my.cnf或my.ini),在[mysqld]段添加 max_allowed_packet = 16M,之后重启MySQL服务。

2. 拆分批量创建为单个插入

如果调整配置后仍有问题,或者不想修改全局配置,可把createMany改成循环单个创建,避免一次性发送过大数据包:

for (const file of filesToUpload) {
  console.log(file);
  const fileData = fs.readFileSync(file.filepath);
  await prisma.vehicle_Images.create({
    data: {
      image: fileData,
    },
  });
  isFirstImage = false;
}

这种方式每次仅发送单张图片数据,不会触发数据包大小限制,但性能略低于批量创建,适合图片数量不多的场景。

3. 检查连接超时设置

若问题是连接超时导致断开,需在schema.prisma的datasource部分调整连接超时参数:

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
  connect_timeout = 30 // 根据实际情况调整,单位为秒
}

同时确保MySQL的wait_timeout和interactive_timeout参数足够大,避免上传过程中连接被主动断开。

额外建议

直接用Blob存图片虽可行,但更推荐将图片存储到对象存储服务,数据库仅保存图片URL。这种方式能降低数据库负载、提升读写性能,还能避免数据包大小限制这类问题。

内容的提问来源于stack exchange,提问作者n9p4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:50:11