当前位置: 首页 > 知识库问答 >
问题:

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

高寒
2023-03-14

我有两个像这样的jdbi刀:

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

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

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

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

在Spring中,我使用了@transactional注释。我可以使用dropwizard和jdbi做什么?

共有3个答案

颛孙庆
2023-03-14

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

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

假设您使用的是JDBI v2. x

武晨
2023-03-14

SQL对象API概述显示了将两个实例绑定到同一个句柄的可能性。这样,您就可以将保存()调用作为同一事务的一部分:

// 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
});

请通过单元测试再次检查功能。

羊舌赞
2023-03-14

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

 类似资料:
  • 我一直想利用Guice 但是,我开始遇到 Governator 和 Dropwizard 之间的类路径问题。我不得不在我的pom.xml中排除以下模块: 注意:我正在使用管理程序版本 1.3.3 但是现在我遇到的问题是没有指定基本包,乍一看是NoSuchMethodError,我想这可能是另一个类路径问题: 但是,在我的应用程序中,我使用了他们在dropwizer-guice github页面上显

  • 我有一个Dropwizard应用程序,它使用Dropwizard度量并使用BigTable进行持久化。我已经从我的应用程序向graphite报告了指标,并且也希望报告客户端BigTable指标。我看到现有的类<code>BigtableClientMetrics<code>支持报告客户端指标<还提供了code>DropwizardMetricRegistry,它包装了DropWidger并创建了类

  • 你好,我正在尝试使用dropwizard框架创建一个应用程序。我有DAO类impl,它需要一个连接管理器实例的句柄,然后用于获取数据库连接。我有一个多租户数据库应用程序。这个连接管理器将是一个自定义实现。 该应用程序使用hikari cp作为连接池和mysql数据库。我想使用dropwizard托管对象功能初始化数据源和连接池。一旦数据源被初始化,我想使用guice绑定在每个dao类中注入连接管理

  • 我正在使用Dropwizard JDBI框架开发一个Web服务。 现在,我想使用“用户指定的参数”,而不是在yaml文件中具有数据库配置,我的意思是,数据库配置将通过endpointURL提供。 通过dropwizard jdbi可以定制信用吗 如果是,在引用此内容时,我应该考虑在代码中进行哪些更改?- http://dropwizard.readthedocs.org/en/latest/man

  • 有人能解释一下我如何在cloud Foundry上部署我的下拉向导应用程序吗?目前我能够部署war文件。但我不知道如何部署下拉向导jar文件? 这是我的主要方法 原木

  • 我正在使用Guice和Dropwizard开发一个应用程序,在其中我们创建了不同的包,如Guice包、migrations包等,并将它们添加到initialize()方法中的bootstrap中。 注意:我知道另一种方法,您可以在run()方法中创建Module类的对象,用于创建注入器(配置和环境对象在MyModule类的构造函数中作为参数传递)。但这需要我在run()方法中注册所有托管对象和所有