Gần đây, tôi đã gặp phải sự cố này. Trong trường hợp của tôi, máy chủ của max_allowed_packet
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 ngay trên 1 MB. Tôi tìm thấy hai ứng cử viên giải pháp.
1) Trước tiên, sử dụng JDBC. Kể từ MySQL Connector/J v3.1.9, có một vài thông số mà bạn có thể thiết lập, đây là bộ của tôi về các thông số trong URL JDBC:
Nối những:
blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000
Kết quả trong 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
làm chèn của bạn, và sử dụng InputStream
để vượt qua các nội dung byte như một tham số để setObject
. Lưu ý rằng setObject
sử dụng mảng byte sẽ không cho phép chia tách blob. Sự kết hợp của các tham số, máy chủ MySQL gần đây (5.0.45 hoặc mới hơn), và InputStream
sẽ gửi dữ liệu blob bằng cách sử dụng cơ chế LONG DATA
, tách các đốm màu 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 trình điều khiển mysqli của PHP 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();
?>
Chỉ cần cố gắng mysqli để lưu trữ một tập tin 27mb trên max_allowed_packet 1mb.Câu trả lời tuyệt vời, chúng tôi đã làm việc trên một công việc xung quanh cho điều này trong gần một tuần. – shmeeps
Không thể đặt các thông số này chỉ cho giao dịch/kết nối hiện tại? Có thể sử dụng 'SET ...'? Tôi thích điều này hơn là thay đổi URL JDBC. –
Làm việc tuyệt vời khi chỉ thêm hai tham số này sử dụngServerPrepStmts = true & maxAllowedPacket = 20000000. Tôi đã thấy 'java.sql.SQLException: Tham số của câu lệnh chuẩn bị được thiết lập thông qua mysql_send_long_data() dài hơn' max_allowed_packet 'bytes', điều này thật lạ khi tôi sử dụng blobSendChunkSize. – Rishi