Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从数千个性能良好的注册表中构建excel工作表?_Java_Loading - Fatal编程技术网

Java 如何从数千个性能良好的注册表中构建excel工作表?

Java 如何从数千个性能良好的注册表中构建excel工作表?,java,loading,Java,Loading,我有大约一百万个注册表,我们的团队正在开发将这些注册表导出到excel的功能 我们使用hibernate每次捕获1000个寄存器,并在文件中写入 尽管如此,这是非常昂贵和缓慢的。用户ericbn建议我使用JDBC代替Hibernate,但这不足以减少时间 我尝试了经典的方法,检索数据并使用图书馆的HSSF工作簿将其放入excel文件中 有没有其他方法我可以遵循 任何帮助都是有效的 这是我的密码: public void serveResource(ResourceRequest request,

我有大约一百万个注册表,我们的团队正在开发将这些注册表导出到excel的功能

我们使用hibernate每次捕获1000个寄存器,并在文件中写入

尽管如此,这是非常昂贵和缓慢的。用户ericbn建议我使用JDBC代替Hibernate,但这不足以减少时间

我尝试了经典的方法,检索数据并使用图书馆的HSSF工作簿将其放入excel文件中

有没有其他方法我可以遵循

任何帮助都是有效的

这是我的密码:

public void serveResource(ResourceRequest request, ResourceResponse response)throws IOException  {


    String inputFile="";
    if (request.getParameter("eventID") != null) {
        inputFile = request.getParameter("eventID").toString();
    }

    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        java.sql.Connection conn=null;
        Statement stmt=null;
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","user","pass");

        stmt =conn.createStatement();

        String strQuery = "select * from table where eventId like '%"+ inputFile +"%'" ;

        ResultSet rs = stmt.executeQuery(strQuery);


        HSSFWorkbook hwb = new HSSFWorkbook();
        HSSFSheet sheet = hwb.createSheet("new sheet");

        HSSFRow rowhead = sheet.createRow((short) 2);
        rowhead.createCell((short) 0).setCellValue("sno");
        rowhead.createCell((short) 1).setCellValue("employeeID");
        rowhead.createCell((short) 2).setCellValue("projectName");
        rowhead.createCell((short) 3).setCellValue("employeeName");
        rowhead.createCell((short) 4).setCellValue("designation");
        rowhead.createCell((short) 5).setCellValue("hasAttended");

        int index = 3;
        int sno = 0;
        String name = "";
        while (rs.next()) {
            sno++;

            HSSFRow row = sheet.createRow((short) index);
            row.createCell((short) 0).setCellValue(sno);
            row.createCell((short) 1).setCellValue(rs.getString(10));
            row.createCell((short) 2).setCellValue(rs.getString(7));
            row.createCell((short) 3).setCellValue(rs.getString(11));
            row.createCell((short) 4).setCellValue(rs.getString(8));
            row.createCell((short) 5).setCellValue(rs.getString(4));
            index++;

        }

        String filename = "ViewAttendees.xls";
        response.setProperty("application/x-excel","");
        response.addProperty("content-disposition", "attachment; filename=" + filename);

        OutputStream os =response.getPortletOutputStream(); 
        hwb.write(os);
        os.close();

    } catch (Exception ex) {
        System.out.println("error: "+ex);
    }
}

我猜你所谓的
寄存器
我称之为
单元格

如果您有一个包含数千个单元格的excel电子表格,并且希望获得良好的性能,则不能使用excel电子表格。这是因为excel电子表格是为许多可能的计算构建的工具,而您只使用其中一种可能的计算

因为您使用的是hibernate,所以我知道您使用的是Java。我还将猜测您使用的是关系数据库,因为这就是hibernate构建的目的。因此,我认为您正在从关系数据库(如Oracle、MySQL、PostGres或Microsoft SQL Server)中提取数据。如果我错了,那就不要太注意下一段

如果数据来自数据库,并且要将其写入电子表格,则需要从数据库中进行数据检索,这样就不必在将部分数据写入电子表格之前将所有数据加载到内存中。这可能意味着从数据库中选择前一千个单元格并写入它们,然后再写入下一千个,以此类推。这可以防止您的程序使用过多内存,这会造成某些类型的性能问题

解决性能问题的真正关键不在于使用哪种工具,而在于确定程序的哪一部分正在使用稀缺资源。对一些人来说,时间是稀缺的资源,对另一些人来说,时间是记忆,而对另一些人来说,时间是另一种东西。良好的性能是知道哪些资源不能使用得更多,哪些资源可以使用得更多。你可以用内存换取时间,或者用时间换取磁盘空间,等等

一旦您能够确定程序的哪个部分太慢,有两种方法:

  • 如果慢的部分用得多,就少用
  • 加快慢的部分
  • 不幸的是,根据你问题的措辞,这可能是你将得到的最佳答案

    祝你好运


    另外,虚拟化只有在你没有足够的“真实”物品的情况下才有帮助,但是真实的物品可以被“假”物品替代。如果你用假“寄存器”替换假“寄存器”,那么你可能得不到任何改进。

    到目前为止你做了哪些尝试?仔细阅读并尝试发布一个。我尝试的是从DB中获取一个基本的get寄存器,并将其作为字符串缓冲区放入文件中。不使用Hibernate,而是直接使用JDBC,可以提高性能。好的,但我们也尝试过这一点,但还不够,因为性能还很慢。有没有其他方法可以改进它?为什么要投否决票?这是一个技术问题,我确实编写了代码,因为插入代码和澄清问题非常简单(只需获取并将数据放入文件),我认为现在对任何人来说都更清楚了。谢谢你的回答,我想最好的方法是使用一些线程,每个线程都会获得大量数据(例如1000个)并写入文件中。也许另一种方法是在许多工作表中写入,每个线程在工作表中写入,最后,我可以将这些文件放在一个大工作表中,或者将所有工作表放在一个zipfile中。你觉得这些选项怎么样?这是一个好的可行的选择吗+1回答:)@RaulSenaFerreira如果你不测量程序的各个部分,并确定哪个部分是慢的部分,你只会让快的部分更快。当慢的部分仍然慢的时候,使快的部分更快是浪费时间和金钱。如果您将快速步骤(程序时间的10%)加快100%,则程序速度将提高5%。如果你把慢的一步(程序的90%)加快了100%,那么程序的速度就加快了45%。不要浪费时间,在你试图加快速度之前,先找出慢的一步(瓶颈)。@RaulSenaFerreira你可以,如果你愿意的话,但是记住,几张反对票甚至不能弥补一张赞成票。只要把答案弄清楚,最终会有人发现,因为他们有类似的问题,然后他们会投票表决。如果你扼杀了那些被否决的东西,你很难获得长期的分数,因为你有更少的“东西”最终在这里和那里获得一个向上的投票。