Jag snubblade nyligen över detta problem. I mitt fall serverns max_allowed_packet
var 1 MB och jag kunde inte göra något för att ändra det. Och jag infogade lite data strax över 1 MB. Jag hittade två lösningskandidater.
1) Använd först JDBC. Sedan MySQL Connector/J v3.1.9 , det finns några parametrar som du kan ställa in, här är min uppsättning parametrar i JDBC URL:
Lägg till dessa:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Resulterar i JDBC URL:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Då måste du använda PreparedStatement
för att göra dina infogningar och använd InputStream
för att skicka byteinnehållet som en parameter till setObject
. Observera att setObject
att använda byte-arrayer kommer inte att aktivera blob-delningen. Kombinationen av parametrar, senaste MySQL-server (5.0.45 eller senare) och InputStream
kommer att skicka blobdata med LONG DATA
mekanism, dela upp klumpen enligt blobSendChunkSize
.
JDBC-lösningen fungerar och jag har testat den.
2) Nu, den andra kandidaten, är att använda PHPs mysqli drivrutin och använd mysqli_send_long_data
. För din bekvämlighet, kopierat från PHP-manualexempel:
<?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();
?>