Java中利用线程和队列实现入库操作

Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢。解决的办法就是将数据库操作单独放置在一个线程中运行,利用队列的特性实现数据接收和入库处理,典型的生产者和消费者的例子。这样为模块化及进一步改进程序提供方便。

线程的实现只要extends Thread就行了,线程的工作在run()方法中实现。实现线程自启动,最好在构造函数中加一句start(),这个很容易。

集合如果选用blockingqueue,要自己实现一堆方法,挺麻烦的,如果使用java.util.Vector就方便很多,相对于ArrayList来说,它线程是安全的。

最近项目需要,写了一个例子,为了结构清晰,去掉了冗余的各种处理,适合有类似的需求的朋友在此基础上加入自己特有的需求实现。

主要代码如下:

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Calendar; import java.util.Vector;

import com.StartPoint;

import com.AInfo; //引用自定义数据类型 import com.CInfo; //引用自定义数据类型 import com.GInfo; //引用自定义数据类型

public class OperateDB extends Thread {    Connection con;

 private Vector<GInfo> QueueGPS;  private Vector<CInfo> QueueCCS;  private Vector<AInfo> QueueCGZ;  private int intListCount=0;

 public OperateDB(Connection pcon)  {   con=pcon;   QueueGPS = new Vector<GInfo>();   QueueCCS = new Vector<CInfo>();   QueueCGZ = new Vector<AInfo>();   start();  }    public int insertGps(GInfo oItem)  {   QueueGPS.add(oItem);   return ++intListCount;  }    public int insertCInfo(CInfo oItem)  {   QueueCCS.add(oItem);   return ++intListCount;  }    public int insertAInfo(AInfo oItem)  {   QueueCGZ.add(oItem);   return ++intListCount;  }    public void run() {   while (true) {    try {     if (intListCount > 0) {      int len = QueueGPS.size();      for (int i = 0; i < len; i++) {       inputGInfo(QueueGPS.remove(0));       intListCount--;      }      len = QueueCCS.size();      for (int i = 0; i < len; i++) {       inputCInfo(QueueCCS.remove(0));       intListCount--;      }      len = QueueCGZ.size();      for (int i = 0; i < len; i++) {       inputAInfo(QueueCGZ.remove(0));       intListCount--;      }     } else {      Thread.sleep(2000);     }    } catch (Exception e) {     e.printStackTrace();    }   }  }    /**   * 增加一条记录   */  private int inputGInfo(GInfo o) {   int tmp = 0;   try {    String sql = "insert into t_ginfo(car,intime,gtime,mainid,subid) values(?,sysdate,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?)";    PreparedStatement pstmt = con.prepareStatement(sql);    pstmt.setString(1, o.getCAR());    pstmt.setString(2, o.gTime());    pstmt.setInt(3, o.getMainId());    pstmt.setInt(4, o.getSubId());    tmp = pstmt.executeUpdate();    pstmt.close();   } catch (Exception e) {    e.printStackTrace();   }   return tmp;  }

 private int inputCInfo(CInfo o) {   int tmp = 0;   try {    String sql = "insert into t_cinfo(car,intime,gtime,mainid,subid) values(?,sysdate,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?)";    PreparedStatement pstmt = con.prepareStatement(sql);    pstmt.setString(1, o.getCAR());    pstmt.setString(2, o.gTime());    pstmt.setInt(3, o.getMainId());    pstmt.setInt(4, o.getSubId());    tmp = pstmt.executeUpdate();    pstmt.close();   } catch (Exception e) {    e.printStackTrace();   }   return tmp;  }

 private int inputAInfo(AInfo o) {   int tmp = 0;   try {    String sql = "insert into t_ainfo(car,intime,gtime,mainid,subid) values(?,sysdate,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?)";    PreparedStatement pstmt = con.prepareStatement(sql);    pstmt.setString(1, o.getCAR());    pstmt.setString(2, o.gTime());    pstmt.setInt(3, o.getMainId());    pstmt.setInt(4, o.getSubId());    tmp = pstmt.executeUpdate();    pstmt.close();    System.out.println("------告警数据插入成功");   } catch (Exception e) {    e.printStackTrace();   }   return tmp;  } }

调用如下:

OperateDB db = new OperateDB(getConnection());

public void run() {

 while(true) {   String sData = GetReceiveString();   GInfo g = GetGInfoByString(sData);   db.insertGInfo(g);  } }

 

posted @ 2013-06-26 15:44  hanks  阅读(1408)  评论(1)    收藏  举报