servlet访问Oracle数据库,存取数据为图片,以二进制数据存入,读取时生成文件,当文件在1M以下时速度很快,可文件在2M左右时写入速度很快,可读取将近1分钟才能生成文件,何况我需要处理的数据好多是几十M的,慢的无法忍受,请问怎么解决,谢谢!看到以前有个类似的帖子,解决办法是用多个线程同时去数据库挖掘数据,回来合并,类似网络蚂蚁的原理.但是我不知道如何去做.无从下手.有高手可以指点一二吗.拜谢...
调试欢乐多
2.考虑数据读取缓存
3.考虑生成文件时的缓存
问题还是出在代码的编写上。我们做的几M的瞬间完成。上百M的也不过1分钟。
* 类此为读一个文件,把读出的数据转化为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();
}
}
}
}