我正在为用户提供编辑数据库中文件的选项。但我不希望同时对同一个文件进行多次编辑,因此为了防止这种情况,我在服务器端使用了静态链表。当客户端将请求更新文件发送到服务器时,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,这样即使发生任何异常,也会从列表中删除该文件的名称。否则该文件将永远不可编辑。我知道这不是最好的方法,但我想知道链接列表是否有任何失败的情况或者是否有更好的解决方案?
提前感谢您的任何帮助或建议......
答案 0 :(得分:1)
有几点。
LinkedList
不是线程安全的。搜索时间也是线性的。您可能需要考虑ConcurrentHashMap
。您执行list.add()
而不是执行ConcurrentMap.putIfAbsent()
并检查返回的值。
人们可能会通过不同的路径,例如绝对vs相对路径都指向同一个实际文件。因此,在您的控制结构中使用File
对象而不是字符串会更好。
我想你想做list.remove(file)
无论更新是否成功。所以你需要把它放到finally
区块。