如何使用JDBC PreparedStatement对象批量处理更新和插入Oracle数据

发布网友 发布时间:2022-04-22 23:29

我来回答

2个回答

懂视网 时间:2022-04-29 23:36

import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; public class ConnectionUtil{ public static final ThreadLocal<Connection> connections = new ThreadLocal<Connection>(); public static Connection getConnection(DataSource dataSource) throws SQLException{   Connection c = connections.get();   if(null==c){     c=dataSource.getConnection();     connections.set(c);
   }   return c;   } }

spring的配置文件就不搞了下面是dao层的具体实现

@Repository
@Scope("prototype")
public class SyslogAlarmDao2 extends JdbcDaoSupport implements InitializingBean{
  @resource
  public void setDatasource(DataSource dataSource){
    this.setDataSource(dataSource);
  }
  private long count = 0L;
  String sql1 = "";
  String sql2 = "";
  PreparedStatement ps1 = null;
  PreparedStatement ps2 = null;
  Connection c = null;
 /**
  这里有篇文章可以帮助理解下面这个注解 http://blog.csdn.net/yaerfeng/article/details/8447530
  */
  @PostConstruct //   public void set() throws SQLException{     sql1 = "sql";//省略,带问号的sql字符串     sql2 ="sql"; //同上     c = ConnectionUtil.getConnection(this.getDataSource());     ps1 = c.prepareStatement(sql1);     ps2 = c.prepareStatement(sql2);
   /**
由于主键是手动控制的,所以需要查一下数据库中已经存在的id的最大值,然后从最大值+1处开始添加数据
alarm和syslogalarm的主键值相同,所以查一个就可以
   */     PreparedStatement ps3 = c.prepareStatement("select max(id) from alarm2");     ResultSet rs = ps3.executeQuery();     while(rs.next()){      count = rs.getLong(1);     }   } public void executeBatch(SyslogAlarm sAlarm) throws SQLException{   if(sAlarm==null||sAlarm.getAlarm ==null){     System.out.println("input error");     return;   }   ps1.setLong(1,count); //从sAlarm中取值填充到ps1的sql字符串中  
//..............   ps2.setLong(1,count);   //从sAlarm中取值填充到ps2的sql字符串中  
//..........   ps1.addBatch();   ps2.addBatch();   System.out.println("调用了 "+count+" 次");   if(count%1000==0){ //为10的时候插入一万条需要4.061秒,为100插入一万数据需要1.403秒,为1000的时候插入一万条数据需要大概需要0.747秒时间     ps1.executeBatch();     ps2.executeBatch();     ps1.clearBatch();     ps2.clearBatch();   }   //ps1.executeBatch(); //执行剩余sql   //ps2.executeBatch(); //同上 } }

测试

//Service shenglue

@Test
public void testBatchInsert(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring xml path");
double start = System.currentTimeMillis();
SyslogAlarmService sas = (SyslogAlarmService) ac.getBean("syslogAlarmService");

for(int i=1;i<10001;i++){//当为1000批处理时,插入一万数据需要一秒左右,十万数据7秒左右,20万数据13秒左右,50万数据31秒左右
Device d = new Device();
d.setId(1);

Alarm alarm = new Alarm();
alarm.setDevice(d);
//alarm.set

SyslogAlarm sAlarm = new SyslogAlarm();
sAlarm.setAlarm(alarm);
//sAlarm.set

sas.batchInsert(sAlarm);

double end = System.currentTimeMillis();
System.out.println("执行了 :"+(end-start)/1000+ " 秒");
}
}

 

使用JDBC批量保存数据(JdbcDaoSupport,JdbcTemplete)

标签:

热心网友 时间:2022-04-29 20:44

 如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com