使用UCanAccess从大文本文件插入数据非常慢

时间:2016-05-24 17:46:00

标签: java jdbc ucanaccess

我正在尝试读取每个文件超过10,000行的文本文件.txt,拆分它们并使用Java和UCanAccess将数据插入Access数据库。问题是每次都变得越来越慢(随着数据库越来越大)。

现在,在阅读了7个文本文件并将其插入数据库之后,项目需要20多分钟才能读取另一个文件。

我试着只读取它并且工作正常,所以问题是实际插入数据库。

N.B:这是我第一次使用UCanAccess和Java,因为我发现JDBC-ODBC Bridge不再可用。任何有关替代解决方案的建议也将受到赞赏。

2 个答案:

答案 0 :(得分:0)

如果您当前的任务只是将大量数据从文本文件直接导入数据库,并且不需要任何复杂的SQL操作,那么您可以考虑直接使用Jackcess API。例如,要导入CSV文件,您可以执行以下操作:

String csvFileSpec = "C:/Users/Gord/Desktop/BookData.csv";
String dbFileSpec = "C:/Users/Public/JackcessTest.accdb";
String tableName = "Book";

try (Database db = new DatabaseBuilder()
        .setFile(new File(dbFileSpec))
        .setAutoSync(false)
        .open()) {

    new ImportUtil.Builder(db, tableName)
            .setDelimiter(",")
            .setUseExistingTable(true)
            .setHeader(false)
            .importFile(new File(csvFileSpec));

    // this is a try-with-resources block, 
    //     so db.close() happens automatically
}

或者,如果您需要手动解析每行输入,插入一行,并检索新行的AutoNumber值,那么代码将更像这样:

String dbFileSpec = "C:/Users/Public/JackcessTest.accdb";
String tableName = "Book";
try (Database db = new DatabaseBuilder()
        .setFile(new File(dbFileSpec))
        .setAutoSync(false)
        .open()) {

    // sample data (e.g., from parsing of an input line)
    String title = "So, Anyway";
    String author = "Cleese, John";

    Table tbl = db.getTable(tableName);
    Object[] rowData = tbl.addRow(Column.AUTO_NUMBER, title, author);
    int newId = (int)rowData[0];  // retrieve generated AutoNumber
    System.out.printf("row inserted with ID = %d%n", newId);

    // this is a try-with-resources block, 
    //     so db.close() happens automatically
}

要根据主键更新现有行,代码为

Table tbl = db.getTable(tableName);
Row row = CursorBuilder.findRowByPrimaryKey(tbl, 3);  // i.e., ID = 3
if (row != null) {
    // Note: column names are case-sensitive
    row.put("Title", "The New Title For This Book");
    tbl.updateRow(row);
}

请注意,为了获得最大速度,我在打开数据库时使用了.setAutoSync(false),但请记住,如果应用程序终止,禁用AutoSync会增加将Access数据库文件置于损坏(并且可能无法使用)状态的可能性执行更新时异常。

答案 1 :(得分:0)

此外,如果您需要使用slq / ucanaccess,则必须在begin的连接上调用setAutocommit(false),并提交每个200/300记录。表演将大幅改善(约99%)。