因为系统业务需要,需要从数据中心导入12年的历史数据到系统。每天平均1000千左右。有一个表有200多个字段,基中还包括几个clob字段。导入方式是用http向服务器一天一天的请求数据。每次请求一天。不能请求太多天,因为服务器请求太多天,有可能返回不了数据。导致失败,Java的JDBC接口写入。每次写数据都是一条一条的写入。刚开始还算顺利,接口过来的数据都能写入进数据库。但问题出现在写入1个月数据左右就开始慢慢的出现卡顿的情况。写入一条记录的数据,有时10几秒,有几几分钟。最坏的时候,就一条数据几个小时还没有写入成功,导致整个同步进程严重拥堵。每次卡死之后,重启数据库服务又可以正常写入。但每次写入一段时候之后,又卡死。
试过以下方法都不见效:
1、停止所有的触发器
2、接收数据表使用nologging表。
3、分次提交,一次不要只提交一条记录。一次提交一天记录。
最后在网上找到了解决方法。也是分次提交,但不是使用executeUpdate()执行,而是使用了先addBatch(), 再executeBatch()的方式。
具体见代码中的: public int executeBatch(String sql, List params) 方法。
附操作数据库的代码
package bh.ojdbc.util;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import bh.getjzdata.Para;
import bh.util.SetRW;
import bh.util.Tool;
/**
* 对jdbc的完整封装
*
*/
public class JDBCUtil {
private static Logger logger = Logger.getLogger(JDBCUtil.class);
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
private CallableStatement callableStatement = null;//创建CallableStatement对象
private Connection conn = null;
private PreparedStatement pst = null;
private ResultSet rst = null;
/*static {
try {
// 加载数据库驱动程序
Class.forName(driver);
} catch (ClassNotFoundException e) {
System.out.println("加载驱动错误");
System.out.println(e.getMessage());
}
} */
public JDBCUtil(){
this.driver = Para.oracle_driver;
this.url = Para.oracle_url;
this.username = Para.oracle_userid;
this.password = Para.oracle_password;
}
public JDBCUtil(String driver,String url ,String username,String password) {
this.driver = driver;
this.url = url;
this.username = username;
<