【问题标题】:Apache Transaction:write file transactionally - how to use resourceIdApache Transaction:事务性写入文件 - 如何使用 resourceId
【发布时间】:2011-01-13 16:40:22
【问题描述】:

如果有人实现了对文件的事务性写入,请帮助我。
相关话题在之前的帖子中讨论过(transactional write)。

用例如下:
如果写入日志文件失败,则应回滚相应的数据库事务。

所以写入文件应该以事务方式执行。

我选择了Apache Commons Transaction lib。
并且有问题,这不会让我走得更远,因为还没有找到合适的文档或示例。

我已经创建了 FileResourceManager 的实例:

FileResourceManager frm = new FileResourceManager("c:\cur", "c:\cur", true, 记录器);

据我了解Apache Commons Transaction tutorial,我应该执行以下步骤:

  1. 开始交易:
    frm.start();

  2. 获取它的交易 ID:
    transactionId = frm.generatedUniqueTxId();

  3. 调用方法,这是必需的,例如带有 transactionId 和 resourceId 的 writeResource:
    frm.writeResource(transactionId, resourceId);

这里有歧义:
a) 如何将resourceId 与真实资源连接,我应该以事务方式编写?
b) 我的文件如何处理,我将以事务方式写入现在关于 resourceId 的内容?

感谢您的建议。

【问题讨论】:

    标签: java file apache-commons transactional


    【解决方案1】:

    到目前为止,没有人回答,我尝试根据我的最新经验来回答。

    有用的文档:
    example2(.ppt)

    简化的算法看起来像(实际上,如示例 2 所示):
    1. 初始化 FileResourceManager
    2. 启动 FileResourceManager
    3. 从 FileResourceManager 实例获取事务 ID
    4. 使用第 3 步中的事务 ID 开始事务
    5. 写入您需要的资源 -这里提到写它事务性
    ,所以看起来这是主要步骤!
    6.提交或回滚事务

    注意:resourceId,关于我在我的问题中提出的问题,只是 name 事务文件。 这个命名并没有很好地描述这个属性。

    代码,我用过:

    private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FileAppender.class);
    private static LoggerFacade loggerFacade = new Log4jLogger(logger);
    
    private static String tempDir = (String) System.getProperties().get("java.io.tmpdir");
    
    private FileResourceManager frm = new FileResourceManager(tempDir, tempDir, false, loggerFacade);
    private static OutputStream outputStream;
    
    public void writeOut(E event) throws IOException {
        Object txId = null;
        try {
            frm.start();
            txId = frm.generatedUniqueTxId();
            frm.startTransaction(txId);
            outputStream = frm.writeResource(txId, fileName, true);
            frm.commitTransaction(txId);
    
        }
    
        catch (Exception e) {
            throw new IOException("DB rollback");
        }
    }
    

    【讨论】:

    • 每个链接都死了!如果可以,请更新。谢谢。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2011-05-27
    • 2018-05-20
    • 1970-01-01
    • 2017-04-10
    • 2021-06-08
    相关资源
    最近更新 更多