用Java将文件读取器保存到数据库中

用Java将文件读取器保存到数据库中,java,database,persistence,dao,bufferedreader,Java,Database,Persistence,Dao,Bufferedreader,我有一个Java阅读器: 读卡器(读卡器读取)来自一个有1000.000行的文件 我需要在我的数据库中保存每一行,我阅读的读者如下: int data = read.read(); String line = ""; while (data != -1) { char dataChar = (char) data; data = read.read();

我有一个Java阅读器: 读卡器
(读卡器读取)
来自一个有1000.000行的文件

我需要在我的数据库中保存每一行,我阅读的读者如下:

            int data = read.read();
            String line = "";


            while (data != -1) {
                char dataChar = (char) data;
                data = read.read();
                if (dataChar != '\n') {
                    line = line + dataChar;
                } else {
                    i++;
                    showline(line);
                    line = "";
                }
            }
然后我为每一行调用我的DAO:

private static void showline(String line) {
    try {
        if (line.startsWith(prefix)) {
            line = line.substring(prefix.length());
        }
        ms = new Msisdn(Long.parseLong(line, 10), idList);
        ListDAO.createMsisdn(ms);
    } catch (Exception e) {
    }
}
我的刀是:

public static void createMsisdn(Msisdn msisdn) {
    EntityManager e = DBManager.createEM();
    try {
        createMsisdn(msisdn, e);
    } finally {
        if (e != null) {
            e.close();
        }
    }

}

public static void createMsisdn(Msisdn msisdn, EntityManager em) {

    em.getTransaction().begin();
    em.persist(msisdn);
    em.getTransaction().commit();

}
但我的问题是,对于一个有1000.000行的文件,完成大约需要1小时30分钟。我怎样才能使它更快


(我的主要问题是调用DAO 1'000.000次,因为它非常慢,因为while更快,没有调用DAO的时间不到1分钟,但是调用DAO的时间是2小时)

读取字符并将它们逐个添加到
字符串中是非常低效的。使用
BufferedReader
读取文本行要好得多:

        String line;
        BufferedReader reader = new BufferedReader(read);
        while ((line = reader.readLine()) != null) {
            showline(line);
        }
不过,在您的情况下,这不会有太大影响:您将每一行插入一个单独的事务中,每个事务可能需要数百毫秒才能完成。您应该以一种可以在单个事务中插入多行的方式来构造代码。例如,您可以像这样读取行块,但您必须更改
showlines
createMsisdn
方法,以便它们一次接受多个,并在单个批处理中处理它们:

        final int TRANSACTION_SIZE = 500;
        int i = 0;
        String[] lines = new String[TRANSACTION_SIZE];
        BufferedReader reader = new BufferedReader(read);
        while ((lines[i] = reader.readLine()) != null) {
            if (i >= lines.length) { 
                showlines(lines, lines.length);
                i = 0;
            } else {
                i++;
            }
        }

        if (i > 0) showlines(lines, i);

如果您可以在一个事务中完成所有操作,那么它可能会更快,或者作为一个批处理,但是如何在一个数据库中上载多行时只在一个事务中完成呢?您的所有代码都演示了基本思想。您需要某种方法从DAO启动、提交或回滚事务