`
tianqinghua
  • 浏览: 27396 次
  • 性别: 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处理100万行超大Excel文件秒级响应

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

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

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

    java解决大批量数据导出Excel产生内存溢出的方案

    这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行处理时。为了解决这个问题,我们可以采用以下几种策略: 1. **分批导出**: - ...

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

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

    java csv大数据量导出(千万级别,不会内存溢出)

    在Java开发中,处理大数据量的数据导出是一个常见的挑战,特别是在CSV格式的文件处理上。CSV(Comma Separated Values)是一种广泛使用的数据交换格式,因其简单性和通用性而受到青睐。然而,当数据量达到千万级别时...

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

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

    java快速插入千万级数据

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

    java数据实时同步系统

    Java数据实时同步系统是一种用于在不同数据库之间进行实时数据交换的技术解决方案。这种系统的主要目标是确保数据的一致性和完整性,特别是在分布式环境中,当数据需要在远程数据库和本地数据库之间频繁流动时。以下...

    海量数据性能分析项目源码(带数据库)

    在IT行业中,海量数据处理和性能...综上所述,这个项目涵盖了Java编程、SQL优化、海量数据处理等多个IT领域的核心知识点。通过学习和实践,我们可以深入了解如何在实际场景中处理大规模数据,提升系统的性能和效率。

    JAVA将一个数据中数据定时自动复制(抽取)到另一个数据库

    本文将深入探讨如何使用Java编程语言实现从一个数据库中定时自动抽取数据并复制到另一个数据库,以达到数据库间的实时或近实时同步。 首先,我们需要了解基础概念。Java是一种广泛使用的面向对象的编程语言,具有...

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

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

    java做数据报表源代码

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

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

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

    java导出30万数据量的excel(采用生成多个excel,最后打包zip)

    在Java开发中,处理大数据量的Excel导出是一项常见的任务,尤其当数据量达到数十万条时,单个Excel文件可能会遇到性能瓶颈或格式限制。本项目针对这一问题提出了一种解决方案,即分块生成多个Excel文件,然后将它们...

    JAVA导出数据到excel中大数据量的解决方法

    web项目中需要有将数据导出excel的操作需求 使用html格式导出方法,但在导出时,根据最大行数重新建立新的excel文件; 数据从数据库取出使用纯jdbc方式读数据,边读边向文件中写; 待所有数据写完,将各个小excel...

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

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

    java实现Excel数据导入到数据库

    在Java编程环境中,将Excel数据导入到数据库以及将数据库数据导出到Excel是常见的数据处理需求。本篇文章将深入探讨如何使用Java实现这两个功能,主要涉及的技术栈包括Apache POI库用于操作Excel,以及JDBC(Java ...

    JAVA数据挖掘

    Java数据挖掘是一个重要的领域,它将编程语言的力量与数据分析的深度结合在一起,为开发者提供了从海量数据中发现有价值信息的能力。在这个案例中,我们将探讨如何使用Java进行数据挖掘,以及这个过程中涉及的关键...

Global site tag (gtag.js) - Google Analytics