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 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); } }