2016-12-08 1 views
0

Dropwizard 문서화에 따르면 DBI.onDemand로 생성 된 DBI dao 인스턴스는 필요에 따라 & 연결을 열 수 있습니다. 나는 Docker 내부에서 Dropwizard를 실행 중일 때 &을 하루 동안 유휴 상태로 두었습니다. 나의 daos는 rdbms에 다시 연결할 수 없습니다.Dropwizard dbi onDemand를 사용하는 적절한 방법

내가하고있는 일은 시작시에 onDemand를 사용하여 DAO 인스턴스를 한 번 가져 오는 것입니다. & 그런 다음 앱의 수명 기간 동안 유지해야합니다. 이것은 onDemand를 사용하는 적절한 방법입니까, 아니면 쿼리를 실행할 때마다 새 DAO 인스턴스를 얻어야합니까?

답변

0

MariaDB와 함께 dropwizard 만 사용했지만 postgresql의 동작이 비슷하다고 가정합니다. 시작시 하나의 dbi 인스턴스를 생성하고이를 사용하여 모든 JDBI 인터페이스에 대해 단일 인스턴스를 생성합니다. 이러한 JDBI 인스턴스는 모든 리소스에서 공유됩니다. 함께 Guice와

베어 뼈의 예는 다음과 같이 보일 것이다 :

당신이 JDBI 인터페이스 UserQuery이 있다고 가정 :
@RegisterMapper(UserMapper.class) 
public interface UserQuery { 

    @GetGeneratedKeys 
    @SqlUpdate("INSERT INTO userData (email, role) values (:email, role)") 
    long insertUser(@BindBean User user); 

    @SqlQuery("SELECT * FROM userData WHERE id = :id") 
    User getUserById(@Bind("id") long id); 

당신이 또 다른 JDBI 인터페이스 CommentQuery을 가정합니다.

시작시 UserQuery와 CommentQuery에 대해 dbi onDemand 인스턴스를 생성하십시오. 인젝터 객체를 만들고 두 인스턴스를 클래스 UserQuery.class 및 CommentQuery.class에 바인딩합니다. 인젝터 객체에서 단일 인스턴스 UserResource를 작성하고 유니폼에 등록하십시오. 따라서 단일 UserQuery 인스턴스, 단일 CommentQuery 인스턴스 및 단일 UserResource 인스턴스로 끝납니다. 당신이

@Override 
public void run(MyConfiguration conf, Environment env) { 
    DBIFactory factory = new DBIFactory(); 
    DBI dbi = factory.build(env, conf.getDatabase(), "mydb"); 
    UserQuery userQuery = dbi.onDemand(UserQuery.class); 
    CommentQuery commentQuery = dbi.onDemand(CommentQuery.class); 
    UserResource userResource = new UserResource(userQuery, commentQuery); 
    env.jersey().register(userResource); 
} 

이 매우 보인다 사용 guice을 (은 UserResource에서 @Inject 주석을 제거)하지 않으

@Path("/user") 
public class UserResource { 
    private final UserQuery userQuery; 
    private final CommentQuery commentQuery; 

    @Inject 
    public UserResource(UserQuery userQuery, CommentQuery commentQuery) { 
     this.userQuery = userQuery; 
     this.commentQuery = commentQuery; 
    } 

    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response createUser(User user) { 
     long userId = userQuery.insertUser(user); 
     Comment comment = new Comment(); 
     comment.setCreatorId(userId); 
     comment.setTitle("Hello everyone!"); 
     commentQuery.insert(comment); 
     return Response.ok().build(); 
    } 
} 

을 또는 :

@Override 
public void run(MyConfiguration conf, Environment env) { 
    Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() { 
     @Override 
     protected void configure() { 
      DBIFactory factory = new DBIFactory(); 
      DBI dbi = factory.build(env, conf.getDatabase(), "mydb"); 
      UserQuery userQuery = dbi.onDemand(UserQuery.class); 
      bind(UserQuery.class).toInstance(userQuery); 
      CommentQuery commentQuery = dbi.onDemand(CommentQuery.class); 
      bind(CommentQuery.class).toInstance(commentQuery); 
     } 
    }); 
    UserResource userResource = injector.getInstance(UserResource.class); 
    env.jersey().register(userResource); 
} 

은 UserResource는 다음과 같이 보일 수 있습니다 당신이 묘사 한 것과 비슷합니다. 나는 또한 dropwizard와 함께 도커를 사용하고 있지만, 지금까지 설명 된 문제에 부딪치지 않았다.

관련 문제