`
tianqinghua
  • 浏览: 27511 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类

java处理海量数据的初步解决思路

阅读更多
  1. 在开发过程中经常遇到,海量数据处理的问题,最近,在工作中遇到给100W用户同事发送邮件,要求用JAVA去实现,由于数据量比较大,内存和服务器CUP都抗不住,为此必须解决这一些列的问题,于是我初步想出一个解决该问题的方法~

         废话少说,晒上代码:

       
  2. package oracle;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class jdbcHelper {
    
    private static Connection con1, con2;
    private static Statement sta;
    private static ResultSet rs;
    /**
      * 分页结果集
      * @param sql
      * @param start
      * @param end
      * @param id
      * @return
      */
    public static List queryList(String sql, int start, int end, Map params) {
      List result=new ArrayList();
      try {
       con1 = JdbcUtils.getConnection();// 获得数据库连接
       StringBuffer buffer = new StringBuffer();
       buffer.append("select * from (select row_.*, rownum rownum_ from ( ");
       buffer.append(sql);
       buffer.append(" ) row_ where rownum ");
       buffer.append(start);
       if(params.size()>0){
        buffer.append(" and id=").append("'").append(params.get("id")).append("'");
       }
       sta = con1.createStatement();
       rs = sta.executeQuery(buffer.toString());
       while (rs.next()) {
        result.add(rs.getString(1));
       }
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       JdbcUtils.closeConnection(rs, sta, con1);
      }
      return result;
    }
    /**
      * 总数
      * @param sql
      * @param id
      * @return
      */
    public static int getCount(String sql,Map params){
     
      int count=0;
      try {
       con1 = JdbcUtils.getConnection();// 获得数据库连接
       StringBuffer buffer = new StringBuffer();
       buffer.append(sql);
       if(params.size()>0){
        buffer.append(" where id=").append("'").append(params.get("id")).append("'");
       }
       sta = con1.createStatement();
       rs = sta.executeQuery(buffer.toString());
       while (rs.next()) {
        count=rs.getInt(1);
       }
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       JdbcUtils.closeConnection(rs, sta, con1);
      }
      return count;
     
    }
    }
    
    上面这段代码主要实现ORCAL数据库分页,目的在于用多少取多少!
    
    package oracle;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * .
     *
     * @author dongwenhua
     *
     */
    public class PageList {
     private int curPage; // 当前是第几页
     private int maxPage; // 一共有多少页
     private int maxRowCount; // 一共有多少行
     private int rowsPerPage = 10;// 每页多少行
     private Object data;
     private int startPage;
     private int endPage;
     
     public int getStartPage() {
      return startPage;
     }
    
     public void setStartPage(int startPage) {
      this.startPage = startPage;
     }
    
     public int getEndPage() {
      return endPage;
     }
    
     public void setEndPage(int endPage) {
      this.endPage = endPage;
     }
    
     public void setCurPage(int c) {
      this.curPage = c ;
     }
    
     public void setMaxPage() { // 根据总行数计算总页数
      if (this.maxRowCount % this.rowsPerPage == 0) {
       this.maxPage = this.maxRowCount / this.rowsPerPage;
      } else {
       this.maxPage = this.maxRowCount / this.rowsPerPage + 1;
      }
     }
    
     public void setMaxRowCount(int m) {
      this.maxRowCount = m;
     }
    
     public int getCurPage() {
      return this.curPage ;
     }
    
     public int getMaxPage() {
      return this.maxPage;
     }
    
     public int getMaxRowCount() {
      return this.maxRowCount;
     }
    
     
     public int getRowsPerPage() {
      return this.rowsPerPage;
     }
    
     public void setMaxPage(int maxPage) {
      this.maxPage = maxPage;
     }
    
     public void setRowsPerPage(int rowsPerPage) {
      this.rowsPerPage = rowsPerPage;
     }
    
     public Object getData() {
      return data;
     }
    
     public void setData(Object data) {
      this.data = data;
     }
    
     
    }
    这个内处理分页和结果集的封装
    
    package oracle;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    
    /**
     * 解决大数据量发邮件问题
     *
     * @author dongwenhua
     *
     */
    public class DataTest {
        private static int no=0;
      public static void main(String[] args) {
      String sql = "select * from test ";
      String count = "select count(1) from test";
      Map params=new HashMap();//存放参数
      int pageSize=10;
      int total= jdbcHelper.getCount(count, params);//总数
      int pageNo=1;
      while(true){
         if (no == total) {
     no=0;   break;
       }
       PageList list = getResultList(sql, count, params, pageNo, pageSize);
       sendMail(list.getData());
       try {
        Thread.sleep(1000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
       pageNo++;
       
      }
          System.out.println("other programm is run contiue");
     }
     
     public static PageList getResultList(String querySql,String countSql,Map params, int pageNo,int pageSize){
      PageList page=new PageList();
      page.setCurPage(pageNo);//当前页
      page.setRowsPerPage(pageSize);//每页显示多少条
      // 计数
      int total = jdbcHelper.getCount(countSql, params);
      page.setMaxRowCount(total);
      page.setMaxPage();//计算出共有多少页
      if(pageNo>page.getMaxPage()){
       pageNo = page.getMaxPage();
      }
      int start = (pageNo - 1) * pageSize;
      int end = pageNo * pageSize;
      // 取单页结果集
      List data = jdbcHelper.queryList(querySql, start, end, params);
      page.setData(data);
      return page;
      
     }
    public static void sendMail(Object obj){
     if(obj instanceof List){
      List list=(List)obj;
      for(int i=0;i<list.size();i++){
       System.out.println("发送邮件--:"+list.get(i));
       no++;
      }
      
      System.out.println("--end--");
     }
    }
    }
  3.  
  4. 递归实现发送邮件
分享到:
评论

相关推荐

    Java海量数据分页Bean

    Java海量数据分页Bean, 适用于Oracle(适当修改,适用于任何数据库).功能描述:传入到达页码(具有容错性)、每页记录数、Select查询语句,返回该页所有的记录(整页是List集合,每条记录是一个 HashMap)、总行数、总...

    Java千万级别数据生成文件思路和优化

    一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件....最近几天现场催的比较紧,最近抽空把这个问题处理了一下,在解决问题的过程中我把解决的步骤和方法记

    java一次性查询处理几百万数据解决方法

    ### Java一次性查询处理几百万数据解决方法 在Java开发中,处理大数据量是常见的需求之一,特别是当数据规模达到几百万级别时,如何高效、稳定地处理这些数据变得尤为重要。本文将详细介绍一种Java一次性查询处理几...

    Java处理100万行超大Excel文件秒级响应

    通过使用EasyExcel,我们不仅解决了处理大量Excel数据时可能出现的内存溢出问题,还大大提高了数据处理的速度。对于104万行20列的大规模Excel文件,EasyExcel能够在70秒内完成处理,极大地提高了工作效率。未来,...

    java实现csv导出千万级数据实例

    CSV(Comma Separated Values)格式因其简单、通用性而广泛用于数据交换,但在处理海量数据时,传统的导出方法可能面临效率和内存管理的难题。 在Java中,Apache POI库通常用于操作Microsoft Office文档,包括Excel...

    Java poi基于事件驱动读取excel 2007海量数据 处理空单元格

    该工具类是poi基于事件驱动去读取海量excel数据,解决内存溢出以及空单元格的问题。 该压缩包里面有两个文件,TestExcel.java主要是原始的处理方法,操作简单,适合小数据量的读取。 ExampleEventUserModelUtil.java...

    java 读取串口数据(绝对可使用)

    Java 读取串口数据是Java编程中一个重要的部分,特别是在物联网(IoT)设备通信、嵌入式系统以及工业自动化等领域。RXTX库是一个流行的开源Java库,用于实现与串行端口(COM口)和并行端口的交互。在本教程中,我们将...

    java快速插入千万级数据

    java快速插入千万级数据,亲测91秒插入1700万数据!!!

    Java Mybatis Maven多线程处理百万数据修改的小工具项目

    本项目"Java Mybatis Maven多线程处理百万数据修改的小工具"正是为了解决这样的问题而设计的。它利用Mybatis作为持久层框架,结合Java的多线程特性,实现了对大量数据进行高效修改的功能。 Mybatis是Java领域广泛...

    海量数据导入

    总结来说,面对“海量数据导入”的挑战,Java POI提供了有效的解决方案,通过按行操作和利用流式API,可以在不消耗大量内存的情况下处理大文件。结合`XxlsAbstract.java`和`XxlsServices.java`等自定义类,我们可以...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    java做数据报表源代码

    本项目“java做数据报表源代码”聚焦于利用Java技术来处理和展示数据,特别是通过FusionCharts包来创建动态图表。 首先,我们来探讨Java在数据报表中的应用。Java可以通过各种方式处理数据,如JDBC(Java Database ...

    java多个数据库实现数据同步

    本文将深入探讨如何使用Java来实现多个数据库之间的数据同步。 首先,我们需要理解数据同步的含义。数据同步是指在两个或多个数据库之间,当某个数据库中的数据发生改变时,这些变化能够被实时或者近实时地反映到...

    《Java面试必知必会》-海量数据类高频问题和参考答案.pdf

    《Java面试必知必会》一书中,针对海量数据处理的部分涵盖了多个重要知识点,这些都是Java开发者在求职面试中经常遇到的问题。以下是对这些知识点的详细解释: 1. **基础知识** - **Bit与Byte**:计算机中最基本的...

    Java读取串口数据并可在网页上调用

    综上所述,这个项目涵盖了Java串口编程、数据处理、Web服务开发以及实时通信等多个方面,是将硬件设备与Web应用结合的典型应用场景。通过学习和实践,不仅可以提升Java技能,还能深入了解物联网和嵌入式系统的数据...

    Java实现Rtsp数据拆包组帧成H264帧

    Java的`java.net.Socket`类可以用来接收TCP数据,而`java.nio`包则提供了非阻塞I/O操作,适合处理UDP数据。 3. **拆包过程**:每个RTP包中的H264 NAL单元可能不完整,需要根据NAL单元的起始标识符(0x000001或0x...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang.OutOfMemoryError: Java heap space”是一种常见的异常情况,它表明Java虚拟机(JVM)...

    利用kettle的api运用Java代码完成数据转换到excel和数据库源码

    利用 Kettle 的 API 运用 Java 代码完成数据转换到 Excel 和数据库源码 Kettle 是一个开源的 ETL 工具,纯 Java 编写,绿色无需安装,数据抽取高效稳定。Kettle 中有两种脚本文件,transformation 和 job,...

    java 将数据保存到指定的文件中

    总的来说,Java提供了丰富的API来处理文件I/O,无论是文本数据还是二进制数据,都可以灵活地保存到指定的文件中。在编写代码时,理解不同类的功能、正确使用流以及妥善处理异常都是确保程序正确性和健壮性的重要因素...

    JAVA数据结构和算法+面试题

    数据结构是组织、存储和处理数据的方式,它允许我们以高效的方式访问和操作数据。在Java中,常见的数据结构包括: 1. **数组**:是最基本的数据结构,用于存储固定数量的同类型元素。 2. **链表**:每个元素(节点...

Global site tag (gtag.js) - Google Analytics