Tomcat服务器连接数超过3个不能上传图片

[color=red]系统基本结构[/color]:Spring+Ext+JPA
[color=red]运行环境[/color]:Tomcat5.5+MySql5.0
[color=red]出现问题[/color]:
连接数在3个及其3个以下的时候,上传图片(给图片的上传路径保存到数据库),保存文字信息到数据库都没有任何问题,超过3个链接的时候,测试用的是4个,第4个连接的电脑就只能保存文字信息而不能上传图片了,这个是什么原因,百思不得其解~盼得到解决方案!
[color=red]附加说明[/color]:当连接数为3及其小于3的时候,同时上传图片没有问题,当第4个链接开启的时候,其他链接不上传图片第4个也不能上传图片,只能 保存文字信息!
[b]问题补充:[/b]
错误提示为:
2009-12-01 10:47:23,750 DEBUG [org.springframework.web.multipart.commons.CommonsMultipartResolver] - Cleaning up multipart file [Filedata] with original filename [Capture_00005.JPG], stored at [E:\Tomcat 5.5\work\Catalina\localhost_\upload__71d49228_12547b0be26__8000_00001737.tmp]
2009-12-01 10:47:24,296 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@a8217b
2009-12-01 10:47:24,296 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space
Caused by:
java.lang.OutOfMemoryError: Java heap space
[b]问题补充:[/b]
上传文件代码:
[code="java"]MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
.getFile(filePath);
Map map = new HashMap();
if(!file.isEmpty()){
System.out.println("文件名为:" + file.getOriginalFilename());
String extend = file.getOriginalFilename().substring(
file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase();
String fileName = "";
float fileSize = file.getSize();// 返回文件大小,单位为k
List errors = new java.util.ArrayList();
boolean flag = false;
for (String s : extendes) {
if (extend.toLowerCase().equals(s))
flag = true;
}
if (flag) {
System.out.println("开始上传...");
File path = new File(saveFilePathName);
if (!path.exists()) {
path.mkdir();
}
;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
DataOutputStream out = new DataOutputStream(new FileOutputStream(
saveFilePathName + File.separator + saveFileName + "."
+ extend));
InputStream is = null;
try {
is = file.getInputStream();
byte[] buffer = new byte[1024];
while (is.read(buffer) > 0) {
out.write(buffer);
}
} catch (IOException exception) {
exception.printStackTrace();
} finally {
if (is != null) {
is.close();
}
if (out != null) {
out.close();
}
}
fileName = saveFileName + "." + extend;
System.out.println("上传结束,生成的文件名为:" + fileName);
} else {
System.out.println("不允许的扩展名");
errors.add("不允许的扩展名");
}
// 生成缩略图
// 下面开始根据长宽生成小图
if (small && isImg(extend)) {
createSmall(saveFilePathName + File.separator + saveFileName + "."
+ extend, saveFilePathName + File.separator + saveFileName
+ "_small" + "." + extend);
map.put("smallFileName", saveFilePathName + File.separator
+ saveFileName + "_small" + "." + extend);
}
// 给图片添加水印
if (wMark && isImg(extend)) {
if (!createMark(saveFilePathName + File.separator + saveFileName
+ "." + extend, markText, Color.RED, 10f)) {
errors.add("水印失败");
}
}
File img=new File(saveFilePathName + File.separator +fileName);
BufferedImage bis = ImageIO.read(img);
int w = bis.getWidth();
int h = bis.getHeight();
map.put("width", w);
map.put("height", h);
map.put("mime", extend);
map.put("fileName", fileName);
map.put("fileSize", fileSize);
map.put("error", errors);
map.put("oldName",file.getFileItem().getName());
}else {
map.put("width", 0);
map.put("height", 0);
map.put("mime", "");
map.put("fileName", "");
map.put("fileSize", 0);
map.put("oldName","");
}
return map;[/code]
[b]问题补充:[/b]
我这里上传后仅仅
[code="java"]out.close(); [/code]
没有
[code="java"]out.flush();
out.close(); [/code]
这里会不会有问题出现呢?
再有就是我调整了tomcat的Xms Xmx,现在不出现同时上传冲突的问题了,用户上传图片的是使用flash的多文件选择,同时上传很多图片,而且每张图片都是3M左右,这样会不会影响系统呢?

3个回答

OOM, 一般就是内存在使用完,没有正确释放。你检查一下代码。也可以先做一个试难,把内存调大点,看看是不是能支持更多的连接。一般都应该是代码有问题。

有没有错误? 我猜测你的上传图片的程序写得有问题,如果是用的第三方类库的话,找一下资料,是不是用得不恰当。不就是传输文件吗,又不是什么特别巨大的文件,不应该有问题的。

建议楼主先把问题缩小范围, 现在好像有三个步骤: 上传,生成缩略图,添加水印。你可以只把一个功能放开,然后把其他功能的代码注释掉,这样缩小范围,问题也就好解决了。

因为从你的代码里也不一定看出来问题,因为还有很多其他类的引用呢。定位问题,恐怕别人帮不上你的忙。 :D

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问