java 排队入库_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 QueueGPS;

private Vector QueueCCS;

private Vector QueueCGZ;

private int intListCount=0;

public OperateDB(Connection pcon)

{

con=pcon;

QueueGPS = new Vector();

QueueCCS = new Vector();

QueueCGZ = new Vector();

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 

inputGInfo(QueueGPS.remove(0));

intListCount--;

}

len = QueueCCS.size();

for (int i = 0; i 

inputCInfo(QueueCCS.remove(0));

intListCount--;

}

len = QueueCGZ.size();

for (int i = 0; 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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值