我有一个场景,我通过循环从Oracle数据库中获取多个图像。但它需要花费大量时间来获取图像并将其显示在浏览器上。 通过这段代码我用一些参数调用我的方法。
for(Object[] obj: memberDetails)
{
System.out.println("String.valueOf(obj[0])"+String.valueOf(obj[0]));
try{
memberImage=dtSrvc.getQueImageForQC(Id,String.valueOf(obj[0]));
}
catch(Exception e)
{}
map.put("memImage"+count, memberImage);
key.add("memImage"+count);
hmap.put("memImage"+count, memberImage);
count++;
}
这是我通过其获取图像的查询
ps = conn.prepareStatement("select photo from member_photo where ID='"
+ Id + "' and que_id=" + QueId);
请让我知道如何加快这个过程。 如果网络速度慢,我无法获取所有图像。我的申请目前被许多人使用。
答案 0 :(得分:2)
问题是您使用单个查询从数据库中获取每个图像。它会产生网络开销。您可以尝试此处描述的许多解决方案来更改代码以执行一个查询而不是多个查询。了解如何Batching Select Statements in JDBC。
ps = conn.prepareStatement("select photo from member_photo where ID in (" + inClause.toString() + ')');
如果que_id
是表格中的主键,则您不需要ID
。
答案 1 :(得分:1)
我的建议是首先获取图像并将它们保存为应用程序的可访问和公共文件夹中的纯文件(temp),然后使用img
标记简单地将它们指向简单的图像资源。
这个过程就是这样的。
1.
查询图片并将其保存在/a_public_folder/images/...
下,每个图片的名称为1.jpeg
,2.jpeg
,其中1和2为ids(唯一)。
2.
使用list_id:List<Long>
的简单上下文保留从数据库中检索到的ID
3.
您的最终servlet将如下所示
for(long idx:list_id){
out.print("<img src=\"/a_public_folder/images/"+idx+".jpeg\"/>");
}
4.
您还可以对/a_public_folder/images/*
路径应用过滤器,以便只允许有权查看内容/图片的用户
5.
有一个会话监听器,用于删除关联(提取)的图像到特定的用户会话,或者有一个守护程序线程来清理目录(图像没有更长的链接)间隔。
但我建议从数据库中提取图像到简单的纯文件,并将图像路径保存到数据库中。