【问题标题】:Save a reader of a file in a database in Java用Java在数据库中保存文件的阅读器
【发布时间】:2013-10-07 23:02:48
【问题描述】:

我有一个 Java 阅读器: 阅读器(Reader read) 来自一个包含 1'000.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) {
    }
}

我的 DAO 是:

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();

}

但我的问题是,对于一个包含 1'000.000 行的文件,大约需要 1 小时 30 分钟才能完成。我怎样才能让它更快?

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

【问题讨论】:

  • 如果您可以在单个事务中完成所有操作,它可能会更快或作为批处理过程
  • 但是我怎样才能只在一个事务中上传数据库中的多行呢?
  • 所有代码都展示了基本思想。你需要一些方法来从你的 DAO 启动、提交或回滚事务

标签: java database persistence dao bufferedreader


【解决方案1】:

读取字符并将它们逐个附加到String 中是非常低效的。使用BufferedReader 阅读文本行会更好:

        String line;
        BufferedReader reader = new BufferedReader(read);
        while ((line = reader.readLine()) != null) {
            showline(line);
        }

但这不会对您的情况产生很大影响:您将每一行插入一个单独的事务中,并且每个事务可能需要数百毫秒才能完成。您应该以可以在单个事务中插入多行的方式构建代码。例如,您可以像这样读取行块,但您必须更改 showlinescreateMsisdn 方法,以便它们一次接受多个并在一个批次中处理它们:

        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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2016-08-26
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多