多线程读取文本并解析插入到数据库

该博客介绍了如何使用Java实现多线程并发地从文本文件中读取数据,并通过固定大小的线程池将数据解析后批量插入到数据库。文章涉及ExecutorService、ConcurrentLinkedQueue、CountDownLatch等并发工具,以及批处理SQL操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package com.dragonsoft.extract.support;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 *
 * @author:Yul
 * @date:2017年8月30日
 */
public class ThreadPool {

    private static int DEFAULT_POOL_NUMBER = 8;

    private static ThreadPool instance = new ThreadPool();

    private ExecutorService insertDataPool;

    private ExecutorService readDataPool;

    private ThreadPool() {
       // TODO Auto-generated constructor stub
       insertDataPool = Executors.newFixedThreadPool(DEFAULT_POOL_NUMBER);
       readDataPool = Executors.newFixedThreadPool(DEFAULT_POOL_NUMBER);
    }

    public static ThreadPool getInstance(){
       return instance;
    }

    public void dispatchInsertDataThread(Runnable command){
       insertDataPool.execute(command);
    }

    public void dispatchReadDataThread(Runnable command){
       readDataPool.execute(command);
    }

}


package com.dragonsoft.extract.support;

import java.util.concurrent.ConcurrentLinkedQueue;

public class DataContainer {

    private boolean ending = false;

    private int currCount = 0;

    private int _queueCapacity;

    private ConcurrentLinkedQueue<Object> _queue = new ConcurrentLinkedQueue<Object>();

    public DataContainer() {
       this(20);//默认大小
    }

    public DataContainer(int queueCapacity) {
       this._queueCapacity = queueCapacity;
    }

    public synchronized void insertData(Object data) throws InterruptedException{
       while (currCount > _queueCapacity) {
           wait();
       }
       currCount++;
       _queue.add(data);
       notifyAll();
    }

    public synchronized Object getData() throws InterruptedException{
       while (currCount <= 0) {
           if(!ending){
               wait();
           }else{
               break;
           }
       }
       currCount--;
       Object results = _queue.poll();
       notifyAll();
       if (results == null || results instanceof Integer) {
           this.ending = true;
       }
       return results;
    }

}


package com.dragonsoft.extract.support;

public abstract class EtlConstants {

    public final static Integer EXTRACT_END_FLAG = -1;

}


package com.dragonsoft.extract.service;

import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.dragonsoft.extract.support.DataContainer;
/**
 *
 * @author:Yul
 * @date:2017年8月30日
 */
public class ReadDataService extends AbstractReadDataRunnable {

    public ReadDataService(File srcFile, DataContainer dataContainer, CountDownLatch countDownLatch) {
        super(srcFile, dataContainer, countDownLatch);
        // TODO Auto-generated constructor stub
    }

}



package com.dragonsoft.extract.service;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.commons.lang.StringUtils;

import com.dragonsoft.extract.S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值