servlet访问Oracle数据库,存取数据为图片,以二进制数据存入,读取时生成文件,当文件在1M以下时速度很快,可文件在2M左右时写入速度很快,可读取将近1分钟才能生成文件,何况我需要处理的数据好多是几十M的,慢的无法忍受,请问怎么解决,谢谢!看到以前有个类似的帖子,解决办法是用多个线程同时去数据库挖掘数据,回来合并,类似网络蚂蚁的原理.但是我不知道如何去做.无从下手.有高手可以指点一二吗.拜谢...

解决方案 »

  1.   

    1.以BLOB类型存储
    2.考虑数据读取缓存
    3.考虑生成文件时的缓存
    问题还是出在代码的编写上。我们做的几M的瞬间完成。上百M的也不过1分钟。
      

  2.   

    用BLOB数据类型,用DBMS_LOB内置包来读写。
      

  3.   

    /**
     * 类此为读一个文件,把读出的数据转化为Blob类型的servlet类;
     * 用到了FileInputStream ,BufferedInputStream ,SerialBlob 这些类;
     * 其中文件的路径在windows 中为'\'型的,java要求为'/'型的,所以要做字符转化。
     */
    package com.jlm.train;import java.io.*;
    import java.sql.SQLException;
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import javax.sql.rowset.serial.SerialBlob;/**
     * @author new
     *
     */
    public class InsertBlob extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {

    String photoFileName = null;
    photoFileName = new String(request.getParameter("photo").getBytes("ISO-8859-1"));
    //取的路径为\型的 java要求为/型的;
    response.setContentType("text/html;charset=gbk");
    PrintWriter out = response.getWriter();
    if (photoFileName != null && photoFileName.length() > 0) {
    char chars[] = new char[photoFileName.length()];
    for (int i = 0; i < photoFileName.length(); i++) {
    char cha = photoFileName.charAt(i);
    if ( cha == '\\' ) {
    cha = '/'; //把字符‘\’转化为‘/’的;
    }
    chars[i] = cha;
    }
    photoFileName = new String(chars);
    try {
    int size = 0;
    // InputStream stream = request.getInputStream();
    //当同时读参数和文件时,getInputStream不能和getParameter同时使用。
    FileInputStream stream = new FileInputStream(photoFileName);
    if (stream != null) {
    size = stream.available();
    BufferedInputStream buffer = new BufferedInputStream(stream);
    byte[] bytes = new byte[size];
    if (buffer != null ) {
    buffer.read(bytes);
    }
    buffer.close();
    try {
    SerialBlob blob = new SerialBlob(bytes);
    //Blob为接口类型,不能实现一个对象, 创建它的一个子类的对象。
    out.println(blob.length());
    if (blob != null) {
          // eb.setPhoto(blob);
    // 可以将blob对象 写到Blob的变量里了。
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    stream.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }