8

如果有人对文件实施事务性写入,请帮助我。
相关主题在前面的线程(事务性写入)中讨论过。

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

因此,文件的写入应该以事务方式执行。

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

我创建了 FileResourceManager 的实例:

FileResourceManager frm = new FileResourceManager("c:\cur", "c:\cur", true, logger);

正如我从这个Apache Commons Transaction 教程中了解到的,我应该执行以下步骤:

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

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

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

这里是模棱两可的:
a)我怎样才能连接resourceId到真实的资源,我应该事务性地写?
b)我现在将以事务方式编写的文件如何处理resourceId

谢谢你的建议。

4

1 回答 1

5

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

有用的文档:
example2(.ppt)

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

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

代码,我用过:

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");
    }
}
于 2011-01-18T17:02:08.633 回答