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); } }
浙公网安备 33010602011771号