Gần đây tôi đã tình cờ gặp vấn đề này. Trong trường hợp của tôi, max_allowed_packet
của máy chủ là 1 MB và tôi không thể làm gì để thay đổi nó. Và tôi đã chèn một số dữ liệu chỉ trên 1 MB. Tôi đã tìm thấy hai ứng cử viên giải pháp.
1) Đầu tiên, sử dụng JDBC.Since MySQL Connector / J v3.1.9 , có một số tham số mà bạn có thể đặt, đây là tập hợp các tham số của tôi trong URL JDBC:
Nối những cái này:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Dẫn đến URL JDBC:
jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Sau đó, bạn phải sử dụng PreparedStatement
để thực hiện các thao tác chèn của bạn và sử dụng InputStream
để chuyển nội dung byte làm tham số cho setObject
. Lưu ý rằng setObject
sử dụng mảng byte sẽ không cho phép tách các đốm màu. Sự kết hợp của các tham số, máy chủ MySQL gần đây (5.0.45 trở lên) và InputStream
sẽ gửi dữ liệu blob bằng LONG DATA
cơ chế, tách blob theo blobSendChunkSize
.
Giải pháp JDBC hoạt động và tôi đã thử nghiệm nó.
2) Bây giờ, ứng cử viên thứ hai, là sử dụng mysqli của PHP trình điều khiển và sử dụng mysqli_send_long_data
. Để thuận tiện cho bạn, hãy sao chép từ ví dụ thủ công 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();
?>