Java 如何提高大型文本文件的数据加载性能

Java 如何提高大型文本文件的数据加载性能,java,sql,oracle,performance,Java,Sql,Oracle,Performance,我正在尝试将一个大的文本文件插入oracle数据库,我当前的程序运行正常,但加载速度非常慢。 文本文件大约为400 MB 我所做的就像下面 ... ArrayList<String> nta = new ArrayList<String>(); while ((line = br.readLine()) != null) { //add data position for each line read data.add(line.substring(0, 6)+ "="+

我正在尝试将一个大的文本文件插入oracle数据库,我当前的程序运行正常,但加载速度非常慢。 文本文件大约为400 MB

我所做的就像下面

...
ArrayList<String> nta = new ArrayList<String>();
while ((line = br.readLine()) != null) {
//add data position for each line read
data.add(line.substring(0, 6)+
"="+line.substring(6, 24)+
"="+line.substring(24, 30)+
"="+line.substring(30, 48)); 

}
db.insertRecord(data);
...

public void insertRecord(ArrayList<String> data) {
String sql = "Insert into Account (NAME, ID, RCBS, CA_NUM, GUID, PARN_GUID)"+
             " values "
             "(?,?,?,?,?,?)";
...
ps = con.prepareStatements(sql);
for(int i=0; i<data.size(); i++) {
    String[] fields = data.get(i).split("=");
            ps.setString(1, fields[0]);
            ps.setString(2, fields[1]); 
            ps.setString(3, fields[2]);
            ps.setString(4, fields[3]); 
            ps.setString(5, fields[0].trim()+"."+fields[1].trim()+"."+fields[2].trim()+"."+fields[3].trim()); //Index
            ps.setString(6, fields[0].trim()+"."+fields[1].trim()); //PARN Index
            ps.execute();
} //end loop
con.commit();
...
。。。
ArrayList nta=新的ArrayList();
而((line=br.readLine())!=null){
//为读取的每行添加数据位置
data.add(行.子字符串(0,6)+
“=”+行。子字符串(6,24)+
“=”+行。子字符串(24,30)+
“=”+行.子串(30,48));
}
db.insertRecord(数据);
...
公共void insertRecord(ArrayList数据){
String sql=“插入帐户(名称、ID、RCB、CA\u NUM、GUID、PARN\u GUID)”+
“价值观”
"(?,?,?,?,?,?)";
...
ps=con.prepareStatements(sql);

对于(int i=0;i将其作为CLOB(一部分中的多行)发送到服务器,并在服务器端进行解析。

将其作为CLOB(一部分中的多行)发送到服务器端,并在服务器端进行解析。

正如建议的那样,在处理这么多记录时,您应该使用批插入。请注意,这段代码将每1000次执行一次插入(并非一次全部)为避免可能的内存问题,
batchInterval

int batchInterval = 1000;

ps = con.prepareStatements(sql);
for(int i=0; i<data.size(); i++) {
        String[] fields = data.get(i).split("=");
        ps.setString(1, fields[0]);
        ps.setString(2, fields[1]);
        ps.setString(3, fields[2]);
        ps.setString(4, fields[3]);
        ps.setString(5, fields[0].trim()+"."+fields[1].trim()+"."+fields[2].trim()+"."+fields[3].trim()); //Index
        ps.setString(6, fields[0].trim()+"."+fields[1].trim()); //PARN Index
        ps.addBatch();

        if (i % batchInterval == 0) ps.executeBatch();
}

ps.executeBatch();
ps.close();
con.close();
int batchInterval=1000;
ps=con.prepareStatements(sql);

对于建议的(int i=0;i,在处理这么多记录时应该使用批插入。请注意,这段代码将每1000次执行一次插入(而不是一次执行全部插入),以避免可能的内存问题,
batchInterval

int batchInterval = 1000;

ps = con.prepareStatements(sql);
for(int i=0; i<data.size(); i++) {
        String[] fields = data.get(i).split("=");
        ps.setString(1, fields[0]);
        ps.setString(2, fields[1]);
        ps.setString(3, fields[2]);
        ps.setString(4, fields[3]);
        ps.setString(5, fields[0].trim()+"."+fields[1].trim()+"."+fields[2].trim()+"."+fields[3].trim()); //Index
        ps.setString(6, fields[0].trim()+"."+fields[1].trim()); //PARN Index
        ps.addBatch();

        if (i % batchInterval == 0) ps.executeBatch();
}

ps.executeBatch();
ps.close();
con.close();
int batchInterval=1000;
ps=con.prepareStatements(sql);

对于(int i=0;i使用批插入。请停止并以正确的方式进行。例如,使用SQL*加载器或外部表。我遇到的问题是文本文件中有一个奇怪的ascii字符。当我使用SQL加载器时,它会像表列use@CrazySabPath的方法一样加载它,我遇到了类似的问题。我分成了“块”-我实际上构建了一个异步api(可以利用多个线程)来处理我们的文档处理-有点过火,但学习过程很棒-哈哈哈-奇怪的ascii字符怎么了当通过java插入时?我希望您可以通过在SQLLDR中指定字符集来加快速度,例如加载数据字符集MSWin1252使用批插入。请停止并正确执行。例如,使用SQL*加载器或外部表。我遇到的问题是文本文件中有一个奇怪的ascii字符。当我使用SQL加载器时将其加载为表列Use@Crazysabpath的方法,我也遇到了类似的问题。我分成了“块”-我实际上构建了一个异步api(将使用多个线程)来处理我们的文档处理-有点过火,但学习过程很棒hahaHi-奇怪的ascii字符会发生什么当通过java插入时?我希望您可以通过在SQLLDR中指定字符集来加速这一过程,例如加载数据字符集MSWin1252您是否建议他在oracle数据库上解析400MB大小的CLOB?为什么不?部分32KB。非常有效,而不是100000个单独的插入。这样,我每月可以导入高达10GB的csv文件n生产数据库您是否建议他在oracle数据库上解析400MB大小的CLOB?为什么不?部分32KB。非常有效,而不是100000个单独插入。这样,我每月在生产数据库中导入多达10GB的csv文件