在 JDBI / Dropwizard 应用程序中使用 @Transaction

Using @Transaction in JDBI / Dropwizard application

我有两个像这样的 jdbi dao:

public interface dao1 {
  @Query("insert into table1 ...")
  findByid(myBean1);
}

public interface dao2 {
  @Query("insert into table2 ...)
  save(myBean2;
  }
}

我想在一个事务中执行两个 dao 的保存,例如:

dao1.save();
dao2.save();

对于spring,我使用了@transactional 注释。我可以用 dropwizard 和 jdbi 做什么?

使用@UnitOfWork

示例:

@POST
@UnitOfWork
public Role create(@Valid RoleApi roleApi) {
    return roleService.create(roleApi);
}

根据 jdbi 文档,

Update, insert, and data definition statements are indicated in the SQL Object API via the @SqlUpdate annotation. The methods for these statements must have either void or int return types. If the return type is int, the the value will be the number of rows changed.

@SqlUpdate注释。这是使用 h2 作为 DB 的示例用法。

DBI dbi = new DBI("jdbc:h2:mem:test");
Handle h = dbi.open();
Dao1 dao1 = h.attach(Dao1.class);
dao1.save(myBean1);

参考:http://jdbi.org/jdbi2/sql_object_api_dml

SQL Object API Overview 显示了将两个实例绑定到同一个句柄的可能性。这样您就可以将 save() 调用作为同一事务的一部分:

// TODO: add try/catch/finally to close things properly
DBI dbi = new DBI("jdbc:h2:mem:test");
Handle h = dbi.open();
h.begin();
Dao1 dao1 = h.attach(Dao1.class);
Dao2 dao2 = h.attach(Dao2.class);
dao1.save(myBean1);
dao2.save(myBean2);
h.commit();
h.close();

如果您使用 onDemand 而不是 open 并且犹豫要不要 try/catch 正确,您可能需要考虑这样的事情:

// add some more interfaces
public interface Dao1 extends GetHandle, Transactional<Dao1> {
   @Query("insert into table1 ...")
   save(myBean1);
}

DBI dbi = new DBI("jdbc:h2:mem:test");
Dao1 dao1 = dbi.onDemand(Dao1.class);

// no try/catch necessary here
dao1.inTransaction(transactional, status) -> {
    transactional.save(myBean1);
    transactional.withHandle((h) -> h.attach(Dao2.class)
       .save(myBean2));
    return null; // return is enforced by the interface
});

请通过单元测试仔细检查功能。

您可以在JDBI 中使用@Transaction。我已经在这里写了博客。 http://manikandan-k.github.io/2015/05/10/Transactions_in_jdbi.html

您可以在 DBI 上使用事务回调:

dbi.useTransaction((handle, transactionStatus) -> {
    Dao1 dao1 = handle.attach(Dao1.class);
    Dao2 dao2 = handle.attach(Dao2.class);
    dao1.save();
    dao2.save();
});

假设您使用的是 JDBI v2.x