java 多线程 *** 作数据库

java 多线程 *** 作数据库,第1张

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

 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 ArrayList<Member> 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(ArrayList<Member> 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=0i<allmembers.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(true&&flag){

   this.inputAll(getAll())

  }

 }

spring事务

数据库事务、连接与java线程之间的关系

最近在处理事务和多线程时,比较困扰数据库事务,数据库连接以及java线程之间的关系。

问题1:事务和连接的关系?

回答:对于数据库事务来说先有一个连接,才能有事务,一个连接里可以有一次或多次事务的提交(自动提交或者手动提交)。对于java中的被transactional注解方法来说,这个被事务管理的方法中可能会使用多个连接。例如一个事务方法里嵌套一个propagation=required的事务方法时,外方法用一个连接,嵌套的方法用一个连接,并且是两个不同的事务。

问题2:连接和线程的关系?

回答:从debug代码看来,一个线程中有去 *** 作数据库,就会去CP获取一个数据库连接,如果此时CP中没有连接可用,就会等待,直到有连接为止。

问题3:一个事务中(transactional注解的方法内)如果开启了多个线程去执行其他的插入 *** 作,那么每个线程执行的插入 *** 作,和线程的caller方法中的插入 *** 作是同一个事务吗?

回答:不是同一个事务

解析:

1.如下图,一个transactional 注解的方法内,先做一次插入 *** 作,接着开了3个线程去分别处理插入任务

 2.执行结果通过看debug日志可看出,在执行testTransAndConnection方法时获取了一个数据库连接,并开启了一个事务,并把事务设置为手动提交,然后进行插入 *** 作,插入 *** 作完成,就call起三个线程并且准备着手提交主方法里的事务了。

 3.每个线程是创建了不同的sqlsession 去处理的,这里用的连接却都还是主方法释放的那个连接(这里都是同一个连接的原因是由于服务起来后,第一次去请求应用,此时数据库连接池还没有初始化完毕,池子里只有刚刚初始化好的一个连接,其他的连接还没来的及初始化出来,所以这里几个线程的 *** 作其实是大家都在等待并争用那唯一的一个数据库连接。等CP初始化完毕,如果再次触发一次请求就会发现:每个线程的sqlsession都是不同的连接)

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

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 ArrayList<Member>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(ArrayList<Member>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=0i<allmembers.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(true&&flag){

this.inputAll(getAll())

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6888806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-29
下一篇 2023-03-29

发表评论

登录后才能评论

评论列表(0条)

保存