首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jdbi,guice和with向导

jdbi,guice和with向导
EN

Stack Overflow用户
提问于 2015-03-23 05:18:12
回答 2查看 4.9K关注 0票数 8

你好,我正在尝试使用下拉向导框架创建一个应用程序。我有DAO类impl,它需要连接管理器实例的句柄,然后用来获取数据库连接。我有一个多租户数据库应用程序。此连接管理器将是自定义实现。

应用程序使用hikari作为连接池和mysql数据库。我希望使用下拉向导托管对象功能初始化数据源和连接池。初始化数据源后,我希望使用guice绑定将连接管理器实例注入到每个dao类中

代码语言:javascript
运行
复制
bind(ConnectionManager.class).toProvider(ConnectionManagerProvider.class);

然后在每个dao impl类中

代码语言:javascript
运行
复制
@Inject
public class UserDAOIpl extends AbstractDAO {
    protected UserDAOImpl(ConnectionManager connectionManager) {
        super(connectionManager);
    }
}

我已经在网上到处查找过了,我的用例没有特别的例子。此外,dropwirzard.io缺乏文档。

这更像是一个架构设计问题,而不是代码问题。

数据源模块将是一个单独的模块,将用于许多服务。我正在使用maven作为构建工具。

我的问题是

  1. 我怎么处理这种情况?一些类名和实现指南将非常有用。
  2. 该应用程序将每天发送50万份请求。解决办法应该是可行的。

我期待着社区的任何指导,或者如果有任何机构能给我提供一些好的资源。

注意:我们不会在这个应用程序中使用hibernate,而是使用JDBI。

EN

回答 2

Stack Overflow用户

发布于 2015-04-10 12:30:51

我准备了一个类似于下面描述的设置。它设置guice,初始化一个DBIFactory (您可能需要在您的场景中采用这个部分)。然后将一个JDBI对象移交给存储库实现,该实现可以使用它来持久化类型为Vessel的实体。

(1)将guice添加到项目中

代码语言:javascript
运行
复制
<dependency>
  <groupId>com.hubspot.dropwizard</groupId>
  <artifactId>dropwizard-guice</artifactId>
  <version>x.x.x</version>
</dependency>

(2)在initialize()中设置Guice:

代码语言:javascript
运行
复制
guiceBundle = GuiceBundle.<YourConfiguration>newBuilder()
        .addModule(new GuiceModule())
        .enableAutoConfig("your.package.name.heres")
        .setConfigClass(YourConfiguration.class)
        .build();

(3)用于准备JDBI元素的Guice配置

代码语言:javascript
运行
复制
public class GuiceModule extends AbstractModule {

    private DBI jdbi;

    @Provides
    public DBI prepareJdbi(Environment environment,
                           SightingConfiguration configuration) throws ClassNotFoundException {
        // setup DB access including DAOs
        // implementing a singleton pattern here but avoiding 
        // Guice to initialize DB connection too early
        if (jdbi == null) {
            final DBIFactory factory = new DBIFactory();
            jdbi = factory.build(environment, configuration.getDataSourceFactory(), "h2");
        }
        return jdbi;
    }

    @Provides
    public VesselJDBI prepareVesselJdbi(DBI jdbi) {
        return jdbi.onDemand(VesselJDBI.class);
    }

    @Override
    protected void configure() {
        bind(VesselRepository.class).to(VesselRepositoryImpl.class);
        /* ... */
    }
}

(4)开始在你的课堂上使用它

代码语言:javascript
运行
复制
public class VesselRepositoryImpl implements VesselRepository {

    private VesselJDBI jdbi;    

    @Inject
    public VesselRepositoryImpl(VesselJDBI jdbi) {
        this.jdbi = jdbi;
    }

    public Vessel create(Vessel instance) {
        return jdbi.inTransaction((transactional, status) -> {
            /* do several things with jdbi in a transactional way */
        });
    }

}

(请注意:最后一个代码示例使用了Java 8。若要将JDBI与Java8一起使用Dropwizard 0.8.1,请使用jdbi版本2.62以避免bug https://github.com/jdbi/jdbi/issues/144)

如果这对你有帮助,请告诉我。

诚挚的问候,

亚历山大

票数 8
EN

Stack Overflow用户

发布于 2015-09-23 08:51:02

我不能对此发表评论,但想补充一下亚历克斯的回答:

对于存储库实现,我建议由jDBI来处理存储库,而不是使用Guice。我所做的是:

在Guice模块中,添加一个提供方法:

代码语言:javascript
运行
复制
@Provides
@Singleton
public void repository(Dbi dbi) {
    // dbi.onDemand(whateverYourClassIs.class)
}

在存储库类中,使用@CreateSqlObject使DAO可用:

代码语言:javascript
运行
复制
public abstract class Repo {
    @CreateSqlObject
    abstract Dao dao(); // will return a jDBI managed DAO impl

    public void doWhatever() {
       /// logic
    }
}

这有一个明显的优点,即您现在可以使用jDBI注释。(我还没有找到直接和guice一起使用它们的方法)。例如,如果您需要在事务中执行DAO代码,这是非常好的。Repository仍然是在Guice中处理的,因此它可以被注入到任何地方,但是jDBI处理DAO/Repository代码中的棘手部分。

希望这会有所帮助:)

阿图尔

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29203709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档