Ik stuitte onlangs op dit probleem. In mijn geval is het max_allowed_packet
. van de server was 1 MB en ik kon niets doen om het te veranderen. En ik was wat gegevens aan het invoegen net boven de 1 MB. Ik heb twee oplossingskandidaten gevonden.
1) Gebruik eerst JDBC.Since MySQL Connector/J v3.1.9 , er zijn een paar parameters die je zou kunnen instellen, hier is mijn set parameters in de JDBC URL:
Voeg deze toe:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Resulterend in JDBC-URL:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Dan moet je PreparedStatement
. gebruiken om uw invoegingen te doen, en gebruik de InputStream
om de byte-inhoud als parameter door te geven aan setObject
. Merk op dat setObject
het gebruik van byte-arrays schakelt het splitsen van de blob niet in. De combinatie van parameters, recente MySQL-server (5.0.45 of hoger) en InputStream
zal de blob-gegevens verzenden met LONG DATA
mechanisme, waarbij de blob wordt gesplitst volgens blobSendChunkSize
.
De JDBC-oplossing werkt en ik heb het getest.
2) Nu, de tweede kandidaat, is het gebruik van PHP's mysqli stuurprogramma en gebruik mysqli_send_long_data
. Voor uw gemak gekopieerd uit een PHP-handboekvoorbeeld:
<?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();
?>