「java多线程导入数据」java多线程写入文件

博主:adminadmin 2022-11-23 04:21:05 48

本篇文章给大家谈谈java多线程导入数据,以及java多线程写入文件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java多线程导入数据,怎么实现事务控制

java多线程导入数据,实现事务控制

单一数据库的话,最好是多线程算出来的要入库的数据,返回到主线程里汇总,做最后的排重验证等,然后在主线程里入库

java 多线程 写入数据库 数据池

你这个首先得分开。

第一部分:你有很多线程在往数据池里面写入数据。那么,你的线程只管写数据,不用理会其他的数据。

第二部分:你的另外的线程(这里可以用spring的job定时器启动),这部分只管往数据库写入数据,至于写入的条件,你可以判断数据池的数据是否达到写入的标准。这里的线程可以配置为启动一次就一直运行,或者是隔多少秒继续运行。这样可以提高效率。

第三部分:数据池,这里的数据池一定要第一部分和第二部分的线程都能够访问,并且是唯一的。你可以写一个公用的类来进行控制。

大致就是这样的。

java 多线程操作数据库

//将数据库中的数据条数分段

 public void division(){

  //获取要导入的总的数据条数

  String sql3="SELECT  count(*)  FROM [CMD].[dbo].[mycopy1]";

  try {

   pss=cons.prepareStatement(sql3);

   rss=pss.executeQuery();

   

   while(rss.next()){

   System.out.println("总记录条数:"+rss.getInt(1));

   sum=rss.getInt(1);

   }

   //每30000条记录作为一个分割点

   if(sum=30000){

    n=sum/30000;

    residue=sum%30000;

   }else{

    residue=sum;

   }

   

   System.out.println(n+"  "+residue);

   

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  

 }

线程类

public MyThread(int start,int end) {

  this.end=end; 

     this.start=start;

  System.out.println("处理掉余数");

    try {

    

         System.out.println("--------"+Thread.currentThread().getName()+"------------");

    Class.forName(SQLSERVERDRIVER);

    System.out.println("加载sqlserver驱动...");

    cons = DriverManager.getConnection(CONTENTS,UNS,UPS);

    stas = cons.createStatement();

    System.out.println("连接SQLServer数据库成功!!");

    

    System.out.println("加载mysql驱动.....");

    Class.forName(MYSQLDRIVER);

    con = DriverManager.getConnection(CONTENT,UN,UP);

    sta = con.createStatement();

    // 关闭事务自动提交

    con.setAutoCommit(false);

    System.out.println("连接mysql数据库成功!!");

    

   } catch (Exception e) {

    e.printStackTrace(); 

   }

  // TODO Auto-generated constructor stub

 }

 

 

 public ArrayListMember getAll(){

  Member member;

  String sql1="select * from (select row_number() over (order by pmcode) as rowNum,*" +

    " from [CMD].[dbo].[mycopy1]) as t where rowNum between "+start+" and "+end;

  try {

   System.out.println("正在获取数据...");

   allmembers=new ArrayList();

   rss=stas.executeQuery(sql1);

   while(rss.next()){

    member=new Member();

    member.setAddress1(rss.getString("address1"));

    member.setBnpoints(rss.getString("bnpoints"));

    member.setDbno(rss.getString("dbno"));

    member.setExpiry(rss.getString("expiry"));

    member.setHispoints(rss.getString("hispoints"));

    member.setKypoints(rss.getString("kypoints"));

    member.setLevels(rss.getString("levels"));

    member.setNames(rss.getString("names"));

    member.setPmcode(rss.getString("pmcode"));

    member.setRemark(rss.getString("remark"));

    member.setSex(rss.getString("sex"));

    member.setTelephone(rss.getString("telephone"));

    member.setWxno(rss.getString("wxno"));

    member.setPmdate(rss.getString("pmdate"));

    allmembers.add(member);

   // System.out.println(member.getNames());

   }

   System.out.println("成功获取sqlserver数据库数据!");

   return allmembers;

   

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   System.out.println("获取sqlserver数据库数据发送异常!");

   e.printStackTrace();

  }

  try {

   rss.close();

   stas.close();

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  return null;

 }

 

 public void inputAll(ArrayListMember allmembers){

  System.out.println("开始向mysql中写入");

  String sql2="insert into test.mycopy2 values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

  try {

   ps=con.prepareStatement(sql2);

   System.out.println("-------------------------等待写入数据条数: "+allmembers.size());

   for(int i=0;iallmembers.size();i++){

    ps.setString(1, allmembers.get(i).getPmcode());

    ps.setString(2, allmembers.get(i).getNames());

    //System.out.println(allmembers.get(i).getNames());

    ps.setString(3, allmembers.get(i).getSex());

    ps.setString(4, allmembers.get(i).getTelephone());

    ps.setString(5, allmembers.get(i).getAddress1());

    ps.setString(6, allmembers.get(i).getPmdate());

    ps.setString(7, allmembers.get(i).getExpiry());

    ps.setString(8, allmembers.get(i).getLevels());

    ps.setString(9, allmembers.get(i).getDbno());

    ps.setString(10, allmembers.get(i).getHispoints());

    ps.setString(11, allmembers.get(i).getBnpoints());

    ps.setString(12, allmembers.get(i).getKypoints());

    ps.setString(13, allmembers.get(i).getWxno());

    ps.setString(14, allmembers.get(i).getRemark());

    //插入命令列表

    //ps.addBatch();

    ps.executeUpdate();

   }

   //ps.executeBatch();

   con.commit();

   

   ps.close();

   con.close();

   this.flag=false;

   System.out.println(Thread.currentThread().getName()+"---OK");

  } catch (SQLException e) {

   // TODO Auto-generated catch block

   System.out.println("向mysql中更新数据时发生异常!");

   e.printStackTrace(); 

  }

 }

 @Override

 public void run() {

  // TODO Auto-generated method stub

  while(trueflag){

   this.inputAll(getAll());

  }

 }

java多线程操作数据库

首先,你的确定数据的主键是否可以使用序列自增。

如果可以那么你可以在插入数据的时候获取序列里的值,这样数据就不会重复了。

其次,可以创建一个公共方法,进行数据的插入操作,并且方法类型声明为 static synchronized

类型,这样基本上就不会出现数据重复的现象了

最后,要看你是怎么获得待插入源数据了,这个获得数据源的方法也做成static synchronized的公

共方法。

java多线程导入数据的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java多线程写入文件、java多线程导入数据的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-23,除非注明,否则均为首码项目网原创文章,转载请注明出处。