我最近偶然发现了这个问题。在我的情况下,服务器的max_allowed_packet
是1 MB,我无法改变它。我插入的数据刚好在1 MB以上。我找到两个解决方案候选人
1)首先,使用JDBC。 由于MySQL连接/ J v3.1.9,还有,你可以设置一些参数,这是我的一套在JDBC URL参数:
附加这些:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
在JDBC URL所得:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
则必须使用PreparedStatement
做你的插入,然后使用InputStream
到字节的内容作为参数传递给setObject
。请注意,setObject
使用字节数组将不会启用blob分割。参数组合,最近的MySQL服务器(5.0.45或更高版本)和InputStream
将使用LONG DATA
机制发送blob数据,根据blobSendChunkSize
拆分blob。
JDBC解决方案的工作原理和我已经测试过。
2)现在,第二个候选人,是使用PHP的mysqli驱动程序和使用mysqli_send_long_data
。为了您的方便,复制自PHP手册示例:
<?php
$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp)) {
$stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();
?>
刚试过mysqli在1mb max_allowed_packet上存储27mb文件。真棒回答,我们一直在为此工作近一周。 – shmeeps 2011-08-19 19:47:46
不可能仅为当前事务/连接设置这些参数吗?也许使用'SET ...'?我更喜欢这改变JDBC URL。 – 2015-09-09 13:53:43
加入这两个参数useServerPrepStmts = true&maxAllowedPacket = 20000000时效果很好。我看到'java.sql.SQLException:通过mysql_send_long_data()设置的准备语句的参数比'max_allowed_packet'字节'长,当我使用blobSendChunkSize时这很奇怪。 – Rishi 2017-08-03 23:52:57