इस प्रश्न का उत्तर पहले ही दिया जा सकता है, लेकिन मुझे एक अच्छा नहीं मिल रहा है, मैं एक डेटाबेस से डेटा पढ़ने और कुछ ऑपरेशन करने की कोशिश कर रहा हूं और मेरा स्रोत डेटाबेस 100 मिलियन रिकॉर्ड या 100GB टेबल की तरह बहुत बड़ा है, इसलिए मैं एक समय में कुछ रिकॉर्ड निकालने के लिए नीचे दी गई विधि का प्रयास किया ताकि मुझे स्मृति अपवाद न मिले लेकिन मुझे जो मिल रहा है वह केवल अधिकतम रिकॉर्ड है जो मैंने सेटमैक्सरो () पर सेट किया है, उदाहरण के लिए यदि मैं 100 सेट करता हूं, तो मुझे केवल 100 मिल रहे हैं और मैं इसे MySQL डेटाबेस के विरुद्ध परीक्षण कर रहा हूं।

यहाँ मेरा जावा कोड है:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTest {

    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "root");
             conn.setAutoCommit(false);
             Statement stmt = conn.createStatement();

             stmt.setMaxRows(100);
             ResultSet rs = stmt.executeQuery("select * from mydatabase.posthistory");
             int i=0;
             for (;;) {
                 System.out.println("Reading the set from: "+i);
                    while (rs.next()) {
                        i++;
                        System.out.println(i);
                    }
                    if ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1)) {
                        System.out.println("End of reading.");
                        break;
                    }           
                }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
    }

}

क्या कोई बता सकता है कि मैं यहाँ क्या गलत कर रहा हूँ। कोई मदद या सुझाव बहुत अच्छा होगा। और मैं mysql jsbc ड्राइवर संस्करण 5.1.22 का उपयोग कर रहा हूं। अगर मैं इसे सामान्य रूप से चलाता हूं, तो जावा पूरे डेटा को राम में लाने की कोशिश कर रहा है जो मुझे त्रुटि देता है,

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
0
GRK 25 जून 2018, 23:14

2 जवाब

सबसे बढ़िया उत्तर

विशेष रूप से मैसकल डेटाबेस उपयोग के लिए

    stmt = connection.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                        java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE);

अन्य डेटाबेस के लिए

stmt.setFetchSize(1000);

यह पूरे डेटाबेस को ResultSet ऑब्जेक्ट में नहीं लाएगा।

0
Vivek Basidoni 26 जून 2018, 16:32

Statement.setFetchSize< का इस्तेमाल करें /a> बफ़र की गई पंक्तियों की संख्या को नियंत्रित करने के लिए। डिफ़ॉल्ट 0 है जो ड्राइवर के आधार पर पूरे परिणाम को बफर कर सकता है।

ध्यान दें, MySQL JDBC विकल्प setFetchSize के काम करने के लिए useCursorFetch सक्षम होना चाहिए। देखें कार्यान्वयन नोट:

एक अन्य विकल्प हर बार पंक्तियों की एक निश्चित संख्या को पुनः प्राप्त करने के लिए कर्सर-आधारित स्ट्रीमिंग का उपयोग करना है। यह कनेक्शन गुण useCursorFetch को सही पर सेट करके किया जा सकता है, और फिर setFetchSize(int) को कॉल करके int को हर बार प्राप्त की जाने वाली पंक्तियों की वांछित संख्या के साथ किया जा सकता है:

conn = DriverManager.getConnection(
    "jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"
);

stmt = conn.createStatement();
stmt.setFetchSize(100);
rs = stmt.executeQuery("SELECT * FROM your_table_here");

Statement.setMaxRows केवल लौटाई गई पंक्तियों की संख्या को सीमित करता है और आपके द्वारा देखे गए अनुसार अतिरिक्त पंक्तियों को त्यागने का कारण बनता है।

0
jspcal 26 जून 2018, 02:14