2017-03-09 2 views
0

나는 dao 클래스 생성 및 db 연결을 위해 도구를 만들 때 gradle을 사용하고 jooq를 사용하는 스프링 부팅 응용 프로그램을 사용합니다. 이전에 내 응용 프로그램이 단일 mysql 인스턴스에 연결되었습니다.봄 부팅 응용 프로그램에서 jooq를 사용하여 여러 MySQL 데이터베이스 인스턴스에 연결

spring.datasource.username=user 
spring.datasource.password=password 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 
spring.datasource.name=ds_name 
spring.datasource.schema=ds_schema 
spring.jooq.sql-dialect=MYSQL 

현재 프로젝트 구조가

위의 키 - 값 쌍과 함께) 주요 응용 프로그램 프로젝트 MainApp 데 application.properties입니다 : 아래 우리는 하나의 DB 인스턴스에 연결하는 데 사용되는 구성입니다.

b) Jooq에서 생성 된 DAO 클래스가있는 DBProject와 별도의 응용 프로그램 프로젝트. MainApp에는 DBProject가 포함되어 있습니다.

저는 이것을 위해 빌드 도구로 gradle을 사용하고 있습니다.

여기까지 모든 것이 잘 작동합니다. 하지만 이제 하나의 MySQL 인스턴스에 연결해야합니다. 그래서 DBProject2라는 또 다른 db 프로젝트를 만들었습니다. dbProject2는 다른 mysql 스키마를 사용하여 jooq에 의해 생성 된 DAO 클래스도 포함하고 있습니다. 나는 DBProject가 생성 될 때 정확히 DBProject2를 만들었다.

자, 내 질문은 jar로 MainApp에 두 DBProjects를 모두 포함하면 둘 다 application.properties에서와 동일한 db 구성을 사용합니다. 각각의 db jar를 각각의 db 스키마를 가리 키도록 만들 수있는 방법. 나는 이것에 대해 많이 봤지만 도움이되는 해결책을 찾을 수 없었다.

답변

0

이것은 내 Play 앱에서 여러 (추가) 데이터 소스에 연결하기 위해 수행하는 작업입니다. 나는 그것이 최선의 접근법인지 확신 할 수 없지만, 그것은 나를 위해 아주 잘 작동한다. 아래의 이름을 일반 이름으로 변경했습니다.

// In my application.conf 
 
// default data source 
 
db.default.driver=com.mysql.jdbc.Driver 
 
db.default.url="jdbc:mysql://localhost:3306/myDb?useSSL=false" 
 
db.default.username=myuser 
 
db.default.password="mypassword" 
 

 
// additional data source 
 
db.anothersource.driver=com.mysql.jdbc.Driver 
 
db.anothersource.url="jdbc:mysql://localhost:3306/myothersource?useSSL=false" 
 
db.anothersource.username=myuser 
 
db.anothersource.password="mypassword" 
 

 
// Then in Java, I create a JooqContextProvider class to expose both connections. 
 
public class JooqContextProvider { 
 

 
    @Inject 
 
    Database db; 
 

 
    @Inject 
 
    play.Configuration config; 
 

 
    public JooqContextProvider(){} 
 

 
    /** 
 
    * Creates a default database connection for data access. 
 
    * @return DSLConext. 
 
    */ 
 
    public DSLContext dsl() { 
 
     return DSL.using(new JooqConnectionProvider(db), SQLDialect.MYSQL); 
 
    } 
 

 
    /** 
 
    * Creates an anothersource database connection for data access. 
 
    * @return DSLConext for anothersource. 
 
    */ 
 
    public DSLContext anotherDsl() { 
 
     return DSL.using(
 
      new JooqAnotherSourceConnectionProvider(
 
       config.getString("db.anothersource.url"), 
 
       config.getString("db.anothersource.username"), 
 
       config.getString("db.anothersource.password")), 
 
      SQLDialect.MYSQL); 
 
    } 
 
} 
 

 
// Then I needed to implement my JooqAnotherSourceConnectionProvider 
 

 
public class JooqAnotherSourceConnectionProvider implements ConnectionProvider { 
 

 
    private Connection connection = null; 
 
    String url; 
 
    String username; 
 
    String password; 
 

 
    public JooqAnotherSourceConnectionProvider(String url, String username, String password){ 
 
     this.url = url; 
 
     this.username = username; 
 
     this.password = password; 
 
    } 
 

 
    @Override 
 
    public Connection acquire() throws DataAccessException { 
 
     try { 
 
      connection = DriverManager.getConnection(url, username, password); 
 
      return connection; 
 
     } 
 
     catch (java.sql.SQLException ex) { 
 
      throw new DataAccessException("Error getting connection from data source", ex); 
 
     } 
 
    } 
 

 
    @Override 
 
    public void release(Connection releasedConnection) throws DataAccessException { 
 
     if (connection != releasedConnection) { 
 
      throw new IllegalArgumentException("Expected " + connection + " but got " + releasedConnection); 
 
     } 
 
     try { 
 
      connection.close(); 
 
      connection = null; 
 
     } 
 
     catch (SQLException e) { 
 
      throw new DataAccessException("Error closing connection " + connection, e); 
 
     } 
 
    } 
 
} 
 

 
// Then in Java code where I need to access one or the other data sources... 
 
jooq.dsl().select().from().where()... 
 
jooq.anotherDsl().select().from().where()...