回 帖 发 新 帖 刷新版面

主题:[讨论]用jdbc向数据库插入大数据讨论

目前有个任务,让我头疼不已。希望大家能帮下忙。
    其实任务很简单,把txt文本里的内容写入数据库,只能插入一次生成一条数据,而不是多次插入。但是txt文本大约2G,我的内存只有1G。(关于一个2G的文本怎么来的,就先无视吧。囧)
    按普通的插入方式是不行的了。会有“java.lang.OutOfMemoryError: Java heap space”的错误提示。
    我看了网上的资料,有人说有RandomAccess类插入。。有人说有分块读取的方式插入。一下是我的错误代码。
------------------------------------------------------
   public static void insert(){
        try{
        String sql= "insert into large values (?);";
        PreparedStatement prmt = conn.prepareStatement(sql);
        
        RandomAccessFile  myFile = new RandomAccessFile("F:\\TEXT\\123.txt","rw");
        long length = 100;
        for(int i =0; i  < length; i++){
            myFile.seek(length);
            String str = myFile.readLine();
            System.out.println(i+"FFF:" + str);
            prmt.setString(1, str);
            prmt.executeUpdate();
        }
        myFile.close();
        prmt.close();
        
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
  ----------------------------------------------------------
  lenght是控制我输入的字节,不停的循环输入100个,直至文件输入完毕。
  ----------------------------------------------------------

  此不仅没有插入正确数据,还插入了很多条。程序一塌糊涂的感觉。贴出来的原因是,想告诉大家我也思考了,而不是只伸手要。
  希望大家能多给我点建议,帮我解决这个问题。
    
    



回复列表 (共1个回复)

沙发


更具上述,我改进了下程序。。
程序大体思想是:
    是先读入一行数据,然后追加数据进入该数据项。。
------------------------------------------------------------
public static void insert() {
        try {
            String sql = "insert into large values (1,?);";
            PreparedStatement prmt = conn.prepareStatement(sql);
            File file = new File("F:\\data1\\data.sql");
            RandomAccessFile myFile = new RandomAccessFile(file, "rw");
            long filePointer = 0;
            long length = myFile.length();
            myFile.seek(filePointer);
            str = myFile.readLine();
            System.out.println("FFF:" + str);
            prmt.setString(1, str);
            prmt.executeUpdate();
            myFile.getFilePointer();
            while(filePointer < length){
            
                String str = myFile.readLine();
                String sql2 = "update large set c2 = c2|| '" + str + "' where c1 = 1;";//追加数据的SQL语句
                Statement stmt = conn.createStatement();
                //System.out.println("FFF:" + str);
                prmt.setString(1, str);
                stmt.executeUpdate(sql2);
                myFile.getFilePointer();

            }
            myFile.close();
            prmt.close();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
-------------------------------------------------------------
还是同样抛出异常“Exception in thread "main" java.lang.OutOfMemoryError: Java heap space”。

我现在有个疑问,计算机载读取数据的时候,到底是如何读取的。。。原本以为这样分批写数据可以减少内存的消耗。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册