3
我有一個簡單的web應用程序,其中我使用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();
}
}
...
}
但我有一個問題。我的老師說鎖定s的最佳位置是操作類或命令(如果是簡單的web應用程序)
但是在saveProducts方法中,我在xml文件中寫入新數據之前做了轉換。這意味着如果在action-class中只使用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();
}
// /.....
}
我才能面對在XML寫不正確的數據,如果將動作類只使用writeLock?
目前還不清楚爲什麼你需要一個鎖。你想阻止什麼? –
這是什麼意思?這意味着如果在action-class中只使用writeLock,那麼我會失去對正確讀取數據的控制權?根據定義,寫入鎖包括讀取鎖(sorta)。如果您有寫入鎖定,則可以安全地讀取或寫入受保護的數據。 –
@JB Nizet我嘗試鎖定訪問xml文件,因爲我使用xslt transforamtion添加數據,之後覆蓋xml文件的內容 – Ray