मैं हाल ही में इस समस्या पर ठोकर खाई। मेरे मामले में, सर्वर का max_allowed_packet
1 एमबी था और मैं इसे बदलने के लिए कुछ नहीं कर सकता था। और मैं 1 एमबी से ऊपर कुछ डेटा डाल रहा था। मुझे दो समाधान उम्मीदवार मिले।
1) सबसे पहले, JDBC का उपयोग करना। चूंकि MySQL Connector/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
बाइट सरणियों का उपयोग करने से बूँद विभाजन सक्षम नहीं होगा। मापदंडों का संयोजन, हाल ही का MySQL सर्वर (5.0.45 या बाद का), और InputStream
LONG DATA
. का उपयोग करके ब्लॉब डेटा भेजेगा तंत्र, बूँद को blobSendChunkSize
. के अनुसार विभाजित करना ।
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();
?>