将一个大文件中的每一行(超过6000字符)插入oracle的一个表中
需求:将一个程序错误产生的log的每一行插入Oracle的一个表中以便分析错误
本人用oracle的一些技术解析该文件达不到预期要求,然后用java解析该文件。查看多处资料终于完成该要求。
解决方案:先在数据库建表,存长字符串的字段类型设为clob,然后用jdbc就把该字段当成String就行。oracle将自动将长字符串装入clob中。
代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author lx
* desc:对于较长字符串来说,只要数据库该字段的类型设为了Clob。程序只要通过setString即可达到插入目的
*/
public class InsertClob {
public static void main(String[] args) {
File errorFile=new File("src/error.log");
InputStreamReader isr=null;//用于设置读取字符的编码
Connection conn=null;//数据库连接
PreparedStatement pst=null;//用于设置sql语句
BufferedReader br=null;//用于读取文件的每一行
try {
Class.forName("oracle.jdbc.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
pst=conn.prepareStatement("insert into t_error_log values(?,?)");
conn.setAutoCommit(false);
isr=new InputStreamReader(new FileInputStream(errorFile),"gbk");
br=new BufferedReader(isr);
String tempString=null;
int line=1;
while((tempString=br.readLine())!=null){
pst.setInt(1, line);
pst.setString(2, tempString);
pst.addBatch();
System.out.println("line"+line+" : "+tempString);
if(line%50==0){
pst.executeBatch();
} ;
line++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
try {
if(!conn.isClosed()){
conn.rollback();
System.out.println("插入失败,回滚!");
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
isr.close();
br.close();
pst.close();
conn.close();
}catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}