3

strutsとxslt変換を使用する単純なWebアプリがあります。アクションクラスでは、正しいデータを取得した場合、メソッド「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();
        }
    }
        ...
}

しかし、私は1つの質問があります。私の先生は、lock-sの最適な場所はアクションクラスまたはコマンド(単純なWebアプリの場合)であると言います

しかし、saveProductsメソッドでは、xmlファイルに新しいデータを書き込む前に変換を行います。これは、アクションクラスでwriteLockだけを使用すると、正しいデータの読み取りを制御できなくなることを意味します。

私はXMLProductDAO私はこのようなsmthを持っています

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に誤ったデータを書き込むことに直面する可能性はありますか?

4

1 に答える 1

0

したがって、もちろん、書き込みロックを使用する誤ったコードをいつでも書き込むことができます。ただし、ロックを使用してデータを保護する場合、書き込みロックのみを使用する(そして適切なすべての場所で使用する)場合、データは安全になります。これにより、synchronizedブロックを使用した場合と同じパフォーマンスが得られます。必要に応じて読み取りロックを使用するとパフォーマンスが向上しますが、読み取りロックのみの領域にデータを書き込もうとすると、読み取りロックの使用を追加するとバグが発生する可能性があります。したがって、書き込みロックのみが安全性は高くなりますが、パフォーマンスは低下します。

于 2012-10-03T17:54:06.550 に答える