概述
最近做一个数据下载接口,功能是这样的:拿n个基金的id,轮训接口下载每一个基金id的详细回来录入自己的数据库。n>10000, 所以采用多线程下载入库。ok。。问题来了。当我采用200根线程同时做这个事情的时候。 调用接口没有问题,在入库的时候connection的创建我有两种想法:
第一:200根线程公用一个connection和PreparedStatement。因为我觉得200根线程的入库操作都是一样的。sql语句都一样。 唯一不同的是给sql参数赋值的过程。(也许会有人说。是否会有线程安全的问题。实践证明并没有引发异常。。。这也是我的一个疑问。 求解。。。。),还有一方面的考虑是,频繁的打开,关闭连接也是会造成了一定的内存消耗。
第二:用线程池管理connection,每根线程拥有自己的connection。(这个不用说,大部分首先都会考虑用线程池,但这里也会有一个问题。当启动200根线程,而连接池中供我的连接假设只有50个,那么也就是意味着有150根线程处于等的状态,这就照成整个接口全部执行完消耗的时间增大。)
希望有人能为我解答上面两种方案的优劣。!
代码是这样的。
public class DownloadTask implements Runnable {
private final Connection con;
public DownloadTask(Connection con) {
this.con = con;
}
public void run() {
// Long downloadLong = System.currentTimeMillis();
List<MonitorEntity> monitorEntitys = new ArrayList<MonitorEntity>();
//调用接口下载详细
for (String id : idsList) {
MonitorEntity entity = getMonitorEntity(id);
monitorEntitys.add(entity);
}
// System.out.println("i ="+i+" download api over "+(System.currentTimeMillis()-downloadLong)/1000+" s");
Long timeLong = System.currentTimeMillis();
Connection connection = con;
PreparedStatement ps = null;
try {
// connection.setAutoCommit(false);
ps = connection.prepareStatement(sqlString);
for (MonitorEntity entity : monitorEntitys) {
ps.setString(1, entity.getApi_name());
ps.setString(2, entity.getId());
ps.setString(3, entity.getId_type());
ps.setString(4, entity.getRequest_url());
ps.setInt(5, entity.getHttp_code());
ps.setInt(6, entity.getRes_code());
ps.setInt(7, entity.getRes_time());
ps.setString(8, entity.getRes_msg());
ps.setString(9, entity.getResult());
ps.setString(10, entity.getLast_update_time());
ps.setString(11, entity.getRequest_url());
ps.setInt(12, entity.getHttp_code());
ps.setInt(13, entity.getRes_code());
最后
以上就是震动灰狼为你收集整理的jdbc 多线程公用一个connection PreparedStatement的全部内容,希望文章能够帮你解决jdbc 多线程公用一个connection PreparedStatement所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复