用Java将文件读取器保存到数据库中
我有一个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();
(读卡器读取)
来自一个有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启动、提交或回滚事务