`

java批量插入队列笔记

阅读更多

往数据库里插入大量的数据,当然是批量插入最高效,我们设定一个题目,每次把数据放入队列,当数据大于1000条或者时间大于5分钟后把数据批量入库

队列处理代码:

package bathQueue;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * <p>Title: BatchQueue.java</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * @author 雪含心
 * @date 2014年3月1日
 */
public class BatchQueue<T> {
	
	// 默认间隔处理队列时间
	private static int DEFAULT_TIME = 5000;
	// 默认队列处理长度
	private static int DEFAULT_COUNT = 2000;
	// 设置队列处理时间
	private long handleTime;
	// 设置队列处理长度
	private int handleLength;
	// 阻塞队列
	ArrayBlockingQueue<T> queue = new ArrayBlockingQueue<T>(20000);
	// 回调接口
	private QueueProcess<T> process;
	
	// 用来存放从队列拿出的数据
	private List<T> dataList;
	
	// 往队列添加数据
	public void add(T t){
		queue.add(t);
	}
	// 清理生成的list
	public void clearList(){
		dataList = null;
		dataList = new ArrayList<T>();
	}
	
	/**
	 * 最原始的构造方法,使用这个构造方法设置默认的队列处理时间和数量
	 * @param process
	 */
	public BatchQueue(QueueProcess<T> process){
		 this(DEFAULT_TIME, DEFAULT_COUNT, process);
	}
	/**
	 * 可以设置队列的处理时间和处理长度
	 * @param handleTime
	 * @param handleQueueLength
	 * @param process
	 */
	public BatchQueue(int handleTime, int handleQueueLength, QueueProcess<T> process){
		this.process = process;
		this.handleTime = handleTime;
		this.handleLength = handleQueueLength;
		start();
	}
	private void  start(){
		
		dataList = new ArrayList<T>(handleLength);
		DataListener listener = new  DataListener();
		new Thread(listener).start();
		
	}
	// 队列监听,当队列达到一定数量和时间后处理队列
	class DataListener implements Runnable{
		
		@Override
		public void run() {
			
			long startTime = System.currentTimeMillis();
			T t = null;
			while(true){
				try {
					// 从队列拿出队列头部的元素,如果没有就阻塞
					t = queue.take();
					if(null != t){
						 dataList.add(t);
					}
					if(dataList.size() >= DEFAULT_COUNT){
						startTime = callBack(dataList);
						continue;
  					}
					long currentTime = System.currentTimeMillis();
					System.out.println("currentTime - startTime" + (currentTime - startTime) + "handleTime==>" + handleTime);
					if(currentTime - startTime > handleTime){
						startTime = callBack(dataList);
						continue;
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			
			}
		}

		private long callBack(List<T> dataList) {
			
			// 处理队列
			try{
				System.out.println(dataList);
				process.processData(dataList);
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				// 清理掉dataList中的元素
				clearList();
			}
			
			
			return System.currentTimeMillis();
		}
		
	}
}
 /**
  * add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常 
remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常 
element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常 
offer       添加一个元素并返回true       如果队列已满,则返回false 
poll         移除并返问队列头部的元素    如果队列为空,则返回null 
peek       返回队列头部的元素             如果队列为空,则返回null 
put         添加一个元素                      如果队列满,则阻塞 
take        移除并返回队列头部的元素     如果队列为空,则阻塞 
  */

 数据处理抽象类

package com.zh.utils;

import java.util.List;

/**
 * 批量数据回调接口
 * @author zhanghua
 *
 * @param <T>
 */
public interface  BatchQueueCallback<T> {

	/**
	 * 用于接收批量数据
	 * @param list 批量数据
	 */
	public abstract  void batch(List<T> list);
}

 数据库处理示例

package bathQueue;

import java.util.List;

/**
 * <p>Title: DataInsert.java</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * @author 雪含心
 * @param <T>
 * @date 2014年3月1日
 */
public class DataInsert<T> extends QueueProcess<T> {

	@Override
	public void processData(List<T> list) {
		
 	}
	public static void main(String[] args) throws Exception{
		DataInsert back = new DataInsert<>();
		BatchQueue<String> queue = new BatchQueue<String>(back);
		
		for(int i = 0; i < 20000; i ++){
			queue.add("a" +i);
			Thread.sleep(2000);
		}
	}

}

 

 

分享到:
评论

相关推荐

    java批量插入Oracle数据方法

    以下是对“java批量插入Oracle数据方法”的深入解析,包括代码示例及其背后的原理。 ### 一、Java批量插入Oracle数据方法概览 在Java中,批量插入数据到Oracle数据库主要依赖于`PreparedStatement`对象,该对象...

    Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据).pdf

    对于批量插入,我们可以读取文件中的数据,然后创建多个`Put`对象并将它们添加到批处理队列中: ```java List&lt;Put&gt; puts = new ArrayList(); BufferedReader reader = new BufferedReader(new FileReader("data.txt...

    JDBC批量插入 更新 删除等操作

    批量更新的原理与批量插入类似,都是通过`PreparedStatement`的`addBatch()`方法将多个更新操作加入到一个批处理队列中,然后调用`executeBatch()`方法执行这些更新操作。这种方式可以显著减少网络往返次数,提高...

    java代码oracle数据库批量插入

    ### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...

    JAVA 实现延迟队列的方法

    JAVA 实现延迟队列的方法 JAVA 实现延迟队列的方法是指在 JAVA 中实现延迟队列的方法,即在特定的延迟时间后触发某个事件,这种机制广泛应用于日常开发的场景中,例如用户登录之后5分钟给用户做分类推送、用户多少...

    jdbc批量插入大字段

    因此,"jdbc批量插入大字段"这个话题旨在探讨如何高效地通过Java JDBC来实现Blob字段的批量插入,以提高性能。 首先,我们需要了解JDBC(Java Database Connectivity),它是Java编程语言与各种数据库之间通信的...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    在Mybatis中,批量插入可以通过SqlSession的batch()方法开启批处理模式,然后执行Mapper中的insert方法,最后调用flushStatements()来提交批处理队列。这种方式同样能减少网络通信和数据库的开销。 接下来,我们将...

    java队列模拟实现

    Java队列模拟实现是一个典型的计算机科学中的数据结构应用,它主要涉及了Java编程语言和队列数据结构。在这个工程中,开发者已经创建了一个基于图形用户界面(GUI)的应用程序,用于演示和操作队列的各种功能。以下...

    java 多线程 队列工厂

    同样,当队列为空时,取元素的线程也会被阻塞,直到有新的元素插入。 常见的`BlockingQueue`实现包括`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`等。 ### 5. 并发集合 Java并发库(`...

    java队列实现(顺序队列、链式队列、循环队列)

    Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **...

    kafka消息队列学习笔记

    kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列...

    java 自定义Queue队列

    在Java编程语言中,`Queue`接口是集合框架的一部分,它代表了先进先出(FIFO)的数据结构,也就是我们通常所说的队列。队列是一种非常基础且实用的数据结构,广泛应用于多线程同步、任务调度、缓存管理等多个场景。...

    java 提供消息队列的使用

    Java 消息队列(Message Queue,简称MQ)是一种在分布式系统中用于解耦和异步处理的中间件,它允许应用程序之间通过发送和接收消息进行通信,而无需两者之间直接交互。在Java中,我们可以使用多种MQ实现,如Apache ...

    jdbc-批量插入数据

    本文将深入探讨如何使用JDBC进行批量插入数据,这在处理大量数据时能显著提高性能。 批量插入数据是数据库操作中常见的一种优化策略,特别是在数据分析、数据迁移或大数据处理等场景。传统的单条插入方式可能会导致...

    实例讲解Java批量插入、更新数据

    在Java编程中,批量插入和更新数据是数据库操作中常见的需求,尤其是在处理大量数据时,可以显著提高效率。本文将通过一个具体的实例来探讨如何在Java中实现对Oracle数据库的批量数据操作。 首先,批量插入数据通常...

    java 栈和队列的小例子

    在Java编程语言中,栈(Stack)和队列(Queue)是两种基本的数据结构,它们在处理数据存储和操作方面有着广泛的应用。本教程将通过一些小例子来深入理解这两种数据结构及其在Java中的实现。 栈是一种后进先出(LIFO...

    Java实现的线程池、消息队列功能

    标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...

    java超强笔记

    随着对基础知识的掌握,笔记会进一步带你探索Java集合框架,包括数组列表、链表、队列、栈、映射等数据结构,以及它们在实际问题中的应用。此外,多线程编程也是Java的一大亮点,笔记会介绍线程的创建与同步机制,如...

    msmq.rar_java msmq_java 消息队列_java消息队列_msmq_消息队列

    本文将深入探讨Java如何与MSMQ进行交互,以及创建消息队列的详细步骤。 首先,我们需要理解消息队列的基本概念。消息队列是一种中间件,它允许应用程序之间通过发送和接收消息进行通信,而无需直接调用对方。消息...

    用数组实现的优先队列(JAVA)

    总之,`PriorityQ.java`文件可能是一个简单的数组实现优先队列的示例,通过分析这个文件,我们可以学习到如何利用数组数据结构实现优先队列,以及理解其核心的插入、删除和查找操作。同时,这也能帮助我们更好地掌握...

Global site tag (gtag.js) - Google Analytics