2012-10-03 135 views
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?

+0

目前還不清楚爲什麼你需要一個鎖。你想阻止什麼? –

+1

這是什麼意思?這意味着如果在action-class中只使用writeLock,那麼我會失去對正確讀取數據的控制權?根據定義,寫入鎖包括讀取鎖(sorta)。如果您有寫入鎖定,則可以安全地讀取或寫入受保護的數據。 –

+0

@JB Nizet我嘗試鎖定訪問xml文件,因爲我使用xslt transforamtion添加數據,之後覆蓋xml文件的內容 – Ray

回答

0

所以,當然你總是可以寫不正確的代碼,使用寫鎖。但是,如果只使用寫入鎖定(並在所有適當的位置使用它們),那麼在使用鎖定保護數據時,您的數據將是安全的。這會導致與使用​​塊相同的性能。在適當的情況下使用讀鎖時,性能得到改進,但如果嘗試在僅具有讀鎖的區域中寫入數據,則添加使用讀鎖會增加錯誤的可能性。所以,只有寫入鎖定等於更安全但性能更低。