我为用户提供了编辑数据库中文件的选项。但是我不希望同时对同一个文件进行多次编辑,因此为了防止这种情况,我在服务器端使用了静态链接列表。当客户端将更新文件的请求发送到服务器时,LinkedList.contain(filename)将检查列表中是否存在文件名。如果它不存在,则将其添加并允许更新,否则它将仅在发生错误时返回响应。代码如下所示:
public class UpdateFileServlet extends HttpServlet{
private static List<String> List= new LinkedList<String>();
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String file=req.getHeader("FileName");
if(List.contains(file)){
res.getWriter().write("Error");
res.flushBuffer();
return;
}
List.add(file);
try{
//do the file update;
List.remove(file);
}catch (Exception e1) {
List.remove(file);
e1.printStackTrace();
}
}
}
}
我还添加了try / catch,以便即使发生任何异常,也将从列表中删除文件名。否则文件将永远无法编辑。我知道这不是最好的方法,但是我想知道链表是否会出现故障,或者是否有更好的解决方案?
预先感谢您的任何帮助或建议...
最佳答案
几点。LinkedList
不是线程安全的。搜索时间也是线性的。您可能需要考虑ConcurrentHashMap
。代替执行list.add()
而是执行ConcurrentMap.putIfAbsent()
并检查返回的值。
人们可能会通过不同的路径,例如绝对路径和相对路径均指向同一实际文件。因此,最好在保存结构中使用File
对象而不是字符串。
我想无论更新是否成功,您都想执行list.remove(file)
。因此,您需要将其放入finally
块。