我有一个简单的网络应用程序,其中使用了struts和xslt转换。在动作类中,如果我得到正确的数据,我尝试调用方法“保存”

public ActionForward saveProduct(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws XMLProductDAOException {
    // Validation
    if (sizeValidationErrorList == 0) {
        try {
            writeLock.lock();
            productDAO.saveProducts(document, product, categoryId, subcategoryId);
        } finally {
            writeLock.unlock();
        }
    }
        ...
}


但是我有一个问题。我的老师说,锁的最佳位置是动作类或命令(以简单的网络应用为例)

但是在saveProducts方法中,我先进行转换,然后再将新数据写入xml文件。这意味着如果仅在操作类中使用writeLock,我将失去对读取正确数据的控制。

我的XMLProductDAO我有这样的东西

public void saveProducts(Document document, Product product, Integer categoryId, Integer subcategoryId) throws XMLProductDAOException {
    // /......
    XSLTTransformer xsltTransformer = XSLTTransformer.getInstance();

    Transformer transformer = xsltTransformer.getCachedTransformer(NEW_PRODUCT_REAL_XSL_PATH);

    transformer.setParameter(PARAM_CURRENT_CATEGORY, currentCategory);
    transformer.setParameter(PARAM_CURRENT_SUBCATEGORY, currentSubcategory);
    transformer.setParameter(PARAM_PRODUCT, product);

    Writer result = new StringWriter();

    xsltTransformer.transform(transformer, result);

    File originalXML = new File(PRODUCT_REAL_XML_PATH);
    Writer fileWriter = null;
    try {
        fileWriter = new PrintWriter(originalXML, ENCODING);
        fileWriter.write(result.toString());
    } catch (IOException e) {
        logger.error(IO_EXCEPTION, e);
        throw new XMLProductDAOException(IO_EXCEPTION, e);
    } finally {
        fileWriter.close();
    }
    // /.....
}


如果仅在动作类中使用writeLock,我是否会面对在xml中写入错误的数据?

最佳答案

因此,您当然可以始终编写使用写锁的不正确代码。但是,如果仅使用写锁(并且在所有适当的位置使用写锁)来使用锁保护数据,则数据将是安全的。这将导致与使用synchronized块相同的性能。当在适当的地方使用读锁时,可以提高性能,但是如果尝试在仅具有读锁的区域中写入数据,则添加读锁会增加潜在的错误。因此,仅写锁定等于更高的安全性但更低的性能。

10-07 20:08