PrepareStatement和Batch性能

 

package test;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;

 

import com.fastbo.util.Clock;

import com.fastbo.util.ConnectionFactory;

import com.fastbo.util.DbUtil;

 

/**

 * Description: Jdbc相关性能测试,batch处理,PrepareStatement,Statement等。

 * 

 * <p>

 * Mysql数据库:表结构为简单的id,name(varchar:255),type(varchar:255)字段,id自增

 * </p>

 * 

 * @author Peter Wei Email: <a href="mailto:weigbo@163.com">weigbo@163.com </a>

 * 

 * @version 1.0 2010-8-21

 */

public class JdbcTest {

 

 /**

  * 测试数据量

  */

 public static int TEST_NUM = 10000;

 

 /**

  * 批处理大小

  */

 public static int BATCH_SIZE = 300;

 

 /**

  * 清空数据表

  * 

  * @param con

  */

 public static void clear(Connection con) {

  PreparedStatement ps = null;

  StringBuffer buff = new StringBuffer();

  try {

   buff.append("truncate table bobo");

   ps = con.prepareStatement(buff.toString());

   ps.executeUpdate();

   System.out.println("清空表");

  } catch (SQLException e) {

   e.printStackTrace();

  } finally {

   DbUtil.close(ps);

  }

 }

 

 /**

  * 普通的Statement插入数据

  * 

  * @param con

  */

 public static int add(Connection con) {

  Statement stmt = null;

  int num = 0;

  String sql = "insert into bobo(name,type) values('Peter Wei','test')";

  try {

   stmt = con.createStatement();

   for (int i = 0; i < TEST_NUM; i++) {

    num += stmt.executeUpdate(sql);

   }

   System.out.println("插入数据量:" + num);

  } catch (SQLException e) {

   e.printStackTrace();

  } finally {

   DbUtil.close(stmt);

  }

  return num;

 

 }

 

 /**

  * 用PrepareStatement插入数据

  * 

  * @param con

  */

 public static void addByPrepareStatement(Connection con) {

 

  PreparedStatement ps = null;

  StringBuffer buff = new StringBuffer();

  int num = 0;

  try {

   buff.append("insert into bobo(name,type)");

   buff.append(" values(?,?)");

   ps = con.prepareStatement(buff.toString());

   con.setAutoCommit(false);

   for (int i = 0; i < TEST_NUM; i++) {

int index = 1;

ps.setString(index++, "Peter Wei");

ps.setString(index++, "test");

num += ps.executeUpdate();

   }

   con.commit();

   con.setAutoCommit(true);

   System.out.println("插入数据量:" + num);

  } catch (SQLException e) {

   e.printStackTrace();

  } finally {

   DbUtil.close(ps);

  }

 }

 

 /**

  * 用批处理插入数据

  * 

  * @param con

  */

 public static void addByBatch(Connection con) {

  PreparedStatement ps = null;

  StringBuffer buff = new StringBuffer();

  int sum = 0;

  int[] num = null;

  try {

   buff.append("insert into bobo(name,type) values(?,?)");

 

   con.setAutoCommit(false);

   ps = con.prepareStatement(buff.toString());

   for (int i = 0; i < TEST_NUM; i++) {

    int index = 1;

    ps.setString(index++, "Peter Wei");

    ps.setString(index++, "test");

    ps.addBatch();

    if (i != 0 && i % BATCH_SIZE == 0) {

     num = ps.executeBatch();

     sum += num.length;

     con.commit();

     // System.out.println("batch:" + i);

    }

 

   }

   num = ps.executeBatch();

   sum += num.length;

   con.commit();

   con.setAutoCommit(true);

   System.out.println("批量更新成功 " + sum + " 条记录!");

  } catch (SQLException e) {

   e.printStackTrace();

  } finally {

   DbUtil.close(ps);

  }

 }

 

 public static void main(String[] args) {

  Connection con = ConnectionFactory.getConnection();

  clear(con);

  Clock c = new Clock();

  // 普通的Statement插入数据

  System.out.println("普通的Statement插入数据:");

  c.start();

  add(con);

  c.stop();

  System.out.println(c.toString());

  c.readMilli();

  System.out.println(c.read());

  System.out.println("================================");

 

  clear(con);

  // 通过PrepareStatement插入数据

  System.out.println("通过PrepareStatement插入数据:");

  c = new Clock();

  c.start();

  addByPrepareStatement(con);

  c.stop();

  System.out.println(c.toString());

  c.readMilli();

  System.out.println(c.read());

  System.out.println("================================");

 

  clear(con);

  // 用批处理插入数据

  System.out.println("用批处理插入数据:");

  c = new Clock();

  c.start();

  addByBatch(con);

  c.stop();

  System.out.println(c.toString());

  c.readMilli();

  System.out.println(c.read());

  System.out.println("================================");

 

 }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值