2012-10-03 5 views
3

저는 struts 및 xslt 변형을 사용하는 간단한 웹 응용 프로그램을 보유하고 있습니다. 액션 클래스에서 올바른 데이터를 얻으면 메서드 "save"를 호출하려고 시도합니다.읽기 및 쓰기 잠금

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(); 
     } 
    } 
     ... 
} 

하지만 질문이 하나 있습니다. 우리 선생님은 lock-s를위한 가장 좋은 장소는 액션 클래스 또는 명령입니다 (간단한 웹 앱의 경우)

하지만 saveProducts 메서드에서는 XML 파일에 새 데이터를 작성하기 전에 변환을 수행합니다. 그것은 action-class에서 단지 writeLock을 사용하면 올바른 데이터를 읽는 것에 대한 통제력을 상실한다는 것을 의미합니다.

는 나는이

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에 잘못된 데이터가 기록에 직면받을 수 있습니다 XMLProductDAO?

+0

왜 자물쇠가 필요한지 불분명합니다. 너는 무엇을 막으려 고하는거야? –

+1

''action-class에서 writeLock 만 사용하면 올바른 데이터를 읽지 못하게됩니다. '라는 의미는 무엇입니까? 쓰기 잠금에는 정의에 의한 읽기 잠금 (sorta)이 포함됩니다. 쓰기 잠금 기능이 있으면 보호 할 데이터를 읽거나 쓸 수 있습니다. –

+0

@JB Nizet xslt transforamtion을 사용하여 데이터를 추가하고 XML 파일의 내용을 덮어 쓰면 – Ray

답변

0

그래서 물론 쓰기 잠금을 사용하는 잘못된 코드를 작성할 수 있습니다. 그러나 쓰기 잠금 만 사용하는 경우 (그리고 모든 적절한 위치에서 사용하는 경우) 잠금을 사용하여 데이터를 보호하는 경우 데이터가 안전합니다. 이렇게하면 synchronized 블록을 사용할 때와 동일한 성능이 발휘됩니다. 읽기 잠금을 사용할 때 성능이 향상되지만 읽기 잠금 만 사용하면 읽기 잠금 만있는 영역에 데이터를 쓰려고하면 버그가 발생할 수 있습니다. 따라서 쓰기 잠금 만이 더 안전하지만 성능은 떨어집니다.