`

java 批量添加实例

阅读更多

最近由于工作需要 需要做一个生成海量数据的程序!开始分析这个问题 最终总结如下:

方案一 用jdbc 的API 那么这种方法的效率应该是最高的!

方案二 用hibernate 的API 这个方案比第一种方案的效率低!

我开始很犹豫到底用那一种呢!由于我们的项目使用SSH框架的!如果用单纯的JDBC API 那么还要在连接一次数据库

显然是不可取的!【减少socket通讯可以提高系统性能】

如果单纯的用hibernate 的API 效率太低! 所以我最终选择的方案是二者结合!

干脆吧 这个方法放到hibernate 自动生成的dao里面

OK 首先把你的方法也放到Hibernate生成的dao里面 为什么 原因是用 this.getSession().connection();可以得到连接

Connection conn= this.getSession().connection(); [注意connection()这个方法已经过时]

conn.setAutoCommit(false);//自动提交事物设置为false 不自动提交

String sql = "insert into test(username,userpwd) values(?,?)";

PreparedStatement pstmt = conn.prepareStatement(sql);//创建PreparedStatement 对象

for (int index = 0; index < number; index++) {

   pstmt.setString(1,"username");

   pstmt.setString(2,"userPwd");
   // 将一组对象添加到prepareStatement对象的批处理密令中
    pstmt.addBatch();

   //每5000条进行事物提交
    if (index%5000==0) {
     pstmt.executeBatch(); //执行prepareStatement对象中所有的sql语句
     conn.commit();//事物提交
     this.getSession().flush();//数据库与缓存同步
     this.getSession().clear();//清空缓存
     if (null==conn) { //如果连接关闭了 就在创建一个 为什么要这样 原因是 conn.commit()后可能conn被关闭
      conn = this.getSession().connection();
     }
    }
   }

   pstmt.executeBatch();//1.执行与5000去摸不是0的数据

   conn.commit();//事物提交
   conn.close();//释放连接
   pstmt.close();//释放资源

 

  我以上用的都是PreparedStatement 如果要用Statement 可以改成下面的

 

Connection conn= this.getSession().connection(); [注意connection()这个方法已经过时]

conn.setAutoCommit(false);//自动提交事物设置为false 不自动提交 

Statement st=conn.createStatement();

for (int index = 0; index < number; index++) {

      // 将一组对象添加到Statement对象的批处理密令中

     st.addBatch("insert into test(username,userpwd) values('"+username+"','"+userpwd+"')");

   //每5000条进行事物提交
    if (index%5000==0) {
     st.executeBatch(); //执行prepareStatement对象中所有的sql语句
     conn.commit();//事物提交
     this.getSession().flush();//数据库与缓存同步
     this.getSession().clear();//清空缓存
     if (null==conn) { //如果连接关闭了 就在创建一个 为为什么要这样 原因是 conn.commit()后可能conn被关闭
      conn = this.getSession().connection();
     }
    }
   }

   st.executeBatch();//1.执行与5000去摸不是0的数据

   conn.commit();//事物提交
   conn.close();//释放连接
   st.close();//释放资源

注意Statement与 PreparedStatement在进行批处理时候唯一的不同家就是:addBatch();方法是否传递参数

从效率已经占用内存的多少上 我还是推荐大家使用PreparedStatement

 

说明:由于对公司信息的保护 以上是程序的最简单版本!其他重要数据已经修改!测试时候一次可以插入50万条数据!在大的没有测过!此时服务器还可以继续进行其他的操作!

 

6
1
分享到:
评论
6 楼 y122749315 2010-01-20  
请问为什么我用 this.getSession().connection();得不到连接呢?总是报java.lang.NullPointerException空异常
5 楼 yanshuihualiveses 2009-05-05  
4 楼 skywen 2009-01-20  
你好 刚看到你的信息!你说的问题我做出如下解释

this.getSession().flush();//数据库与缓存同步
this.getSession().clear();//清空缓存
原本的时候我也没有加 this.getSession().clear();//清空缓存
可是造成的问题是我第一次生成20万条  然后在生成20万条!此时内存泄漏!
这就是问什么要加this.getSession().clear();//清空缓存这句话的原因
3 楼 wangxuliangboy 2009-01-18  
this.getSession().flush();//数据库与缓存同步
     this.getSession().clear();//清空缓存
这有意义吗
2 楼 skywen 2009-01-16  
[color=brown]所有的问题 如果都向你说的哪像!那么岂不是连程序都可以不写了?不满你说:我是oracle DBA!难道我不知道,交给数据库处理吗!问题是我们的程序是交给客户的!难道让客户还要请一个DBA吗?着可能吗?做为一个程序员,应该清楚:我们面向的是客户!不是自己!更不是所有的程序员![/color]
1 楼 liujunsong 2009-01-16  
这个问题我有不同的意见.
简单来说,一句话, java根本就不是来干这个用的.
要批量生成数据,最简单,最可靠的办法就是利用数据库的开发环境,写一段脚本让数据库自己去玩,或者生成一个标准的数据文件,通过数据库工具或者脚本去装入.
例如:PL/SQL,isql,写成一个脚本或者存储过程.

建议:找个DBA咨询一下吧.

相关推荐

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    实例讲解Java批量插入、更新数据

    片文章介绍了一个Java批量添加数据,多个字段同时添加多条数据具体实例,面向的是Oracle数据库,需要的朋友可以参考下

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 实例079 判断手机号的合法性 99 实例080 用字符串构建器追加字符 100 实例081 去掉...

    java连接opc读取数据

    最近由于项目需要,在已有java web工程里添加读取opc的接口类。通过接口将opc数据读取到本地存于oracle数据库中,供本管理系统趋势分析用。本实例在win7、xp系统本地均已调通。压缩包里有本人写的每一步详细说明操作...

    postman+json+springmvc测试批量添加实例

    其中每一条数据对象对应后台接口要保存的一条数据库记录,一个java对象; 到此,postMan的配置完成,只要点击send按钮触发发送事件即可已发送json格式的数据到后端接口。 服务器接口配置:已springmvc来说明: ...

    Java实现批量导入excel表格数据到数据库中的方法

    主要介绍了Java实现批量导入excel表格数据到数据库中的方法,结合实例形式详细分析了java导入Excel数据到数据库的具体步骤与相关操作技巧,需要的朋友可以参考下

    Java添加图片水印效果.rar

    Java为图片添加水印效果,将两张图像合成为一张,添加前可预览水印,对bmp后缀的图片格式进行处理, 支持批量添加水印图像,生成水印图片。  @param buffImg 图像加水印之后的BufferedImage对象  @param ...

    java开源包6

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包9

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包11

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

Global site tag (gtag.js) - Google Analytics