spring boot 1.5.4多データソースの配置問題を解決する。


spring bootはもう多データソースの配置を支持しました。ネット上で何かを書く必要がないです。特に面倒です。下記の解決案を見てください。公式のものです。安心してください。
1.まずデータソースの設定を定義する

#=====================multiple database config============================
#ds1
first.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true
first.datasource.username=root
first.datasource.password=123456
first.datasource.driver-class-name=com.mysql.jdbc.Driver
first.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
first.datasource.max-wait=10000
first.datasource.max-active=200
first.datasource.test-on-borrow=true
first.datasource.initial-size=10

#ds2
second.datasource.url=jdbc:mysql://localhost/test2?characterEncoding=utf8&useSSL=true
second.datasource.username=root
second.datasource.password=123456
second.datasource.driver-class-name=com.mysql.jdbc.Driver
second.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
second.datasource.max-wait=10000
second.datasource.max-active=200
second.datasource.test-on-borrow=true
second.datasource.initial-size=10

#=====================jpa config================================
#                :update/create/create-drop/validate/none
spring.jpa.hibernate.ddl-auto=none
#  sql  
spring.jpa.show-sql=true
#      json   
spring.jackson.serialization.indent_output=true

2.ds 1の関連注入対象の配置とjpaサポートの有効化

/**
 * Created by hdwang on 2017-06-16.
 *         
 * If you are using Spring Data, you need to configure @EnableJpaRepositories
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.firstDs",entityManagerFactoryRef = "firstEntityManagerFactory",transactionManagerRef="firstTransactionManager")
public class FirstDsConfig {

  /**
   *        
   * Primary        ,Autowire   ,            
   * @return
   */
  @Bean
  @Primary
  @ConfigurationProperties("first.datasource")
  public DataSourceProperties firstDataSourceProperties() {
    return new DataSourceProperties();
  }

  /**
   *      
   * @return
   */
  @Bean
  @Primary
  @ConfigurationProperties("first.datasource")
  public DataSource firstDataSource() {
    return firstDataSourceProperties().initializeDataSourceBuilder().build();
  }

  /**
   *       
   * @param builder  spring      ,    type  (      @Primary   ),    name  
   * @return
   */
  @Bean
  @Primary
  public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
      EntityManagerFactoryBuilder builder) {
    return builder
        .dataSource(firstDataSource())
        .packages("com.hdwang.entity.dbFirst")
        .persistenceUnit("firstDs")
        .build();
  }

  /**
   *       
   * @return
   */
  @Bean(name = "firstTransactionManager")
  @Primary
  public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
  }

  @Bean
  @Primary
  public JdbcTemplate jdbcTemplate(){
    return new JdbcTemplate(firstDataSource());
  }

  @Bean
  @Primary
  public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
    return new TransactionTemplate(platformTransactionManager);
  }
}
関連する知識点:
1.@Beanを使って、beanオブジェクトを作成してspring容器に渡すことができます。
2.@ Beanで作成したbeanオブジェクトの名前はデフォルトでメソッド名としても指定できます。
3.Beanメソッドパラメータ表示では、Beanオブジェクトを受信し、デフォルトではtypeタイプで注入対象を受信し、byName方式に変更するなら、@Qualfier注解を使用して正確なオブジェクトを注入することができます。
4.5@Primaryはこのタイプのデフォルトbeanを表しています。他のところでは@Autowiredでタイプ別に注入できます。同じタイプの複数のオブジェクトの影響を受けません。
5.EnbaleJPaRepositoriesは、spring data jpaのサポートを有効にするという意味で、jpaの新しい使い方を示しています。basePackagesが指すことに注意してください。@Repositoryインターフェースのあるカバンの位置は、複数配置できます。
他の注釈は分かりません。
2.ds 2の関連注入対象の配置とjpaサポートの有効化

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.secondDs", entityManagerFactoryRef = "secondEntityManagerFactory",transactionManagerRef = "secondTransactionManager")
public class SecondDsConfig {

  @Bean
  @ConfigurationProperties("second.datasource")
  public DataSourceProperties secondDataSourceProperties() {
    return new DataSourceProperties();
  }

  @Bean
  @ConfigurationProperties("second.datasource")
  public DataSource secondDataSource() {
    return secondDataSourceProperties().initializeDataSourceBuilder().build();
  }

  /**
   *       
   * @param builder  spring      ,    type  (      @Primary   ),    name  
   * @return
   */
  @Bean
  public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
      EntityManagerFactoryBuilder builder) {
    return builder
        .dataSource(secondDataSource())
        .packages("com.hdwang.entity.dbSecond")
        .persistenceUnit("secondDs")
        .build();
  }

  /**
   *       
   * @param secondEntityManagerFactory         (      )
   * @return        
   */
  @Bean(name = "secondTransactionManager")
  public PlatformTransactionManager transactionManager(@Qualifier("secondEntityManagerFactory")LocalContainerEntityManagerFactoryBean secondEntityManagerFactory){
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(secondEntityManagerFactory.getObject());
    return transactionManager;
  }

  @Bean(name="jdbcTemplate2")
  public JdbcTemplate jdbcTemplate(){
    return new JdbcTemplate(secondDataSource());
  }

  @Bean(name = "transactionTemplate2")
  public TransactionTemplate transactionTemplate(@Qualifier("secondTransactionManager")PlatformTransactionManager transactionManager){
    return new TransactionTemplate(transactionManager);
  }
}
3.Repositoryデータ耐久層

package com.hdwang.dao.datajpa.firstDs;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
  /**
   * spring data jpa        (        )
   * @return
   */
  User findByNumber(String number);


  @Modifying
  @Query("delete from User u where u.id = :id")
  void deleteUser(@Param("id")int id);
}

package com.hdwang.dao.datajpa.secondDs;

@Repository
public interface OrderRepository extends JpaRepository<Order, Integer> {
  /**
   * spring data jpa        (        )
   * @return
   */
  User findByNumber(String number);


  @Modifying
  @Query("delete from Order o where o.id = :id")
  void deleteUser(@Param("id") int id);
}
上の二つのインターフェースは二つのデータソースに属しています。@EnbaleJparepositoriesの配置が終わったら、ここで正しい操作ができます。
4.Serviceサービス層は、ものに注意します。

@Service
@Transactional("firstTransactionManager")
public class UserServiceImpl implements UserService {

  @Autowired
  private UserRepository userRepository;

  @Override
  public User findById(int id) {
    return this.userRepository.findOne(id);
  }

  @Override
  public User findByNumber(String number) {
    return this.userRepository.findByNumber(number);
  }

  @Override
  public List<User> findAllUserByPage(int page,int size) {
    Pageable pageable = new PageRequest(page, size);
    Page<User> users = this.userRepository.findAll(pageable);
    return users.getContent();
  }

  @Override
  public User updateUser(User user,boolean throwEx) {
    User userNew = this.userRepository.save(user);
    if(throwEx){
      throw new RuntimeException("throw a ex");
    }
    return userNew;
  }

  @Override
  public void deleteUser(int id) {
    this.userRepository.deleteUser(id);
  }
}

@Service
@Transactional("secondTransactionManager")
public class OrderServiceImpl implements OrderService {

  @Autowired
  private OrderRepository orderRepository;


  @Override
  public Order findById(int id) {
    return this.orderRepository.findOne(id);
  }

  @Override
  public Order updateOrder(Order order, boolean throwEx) {
    Order orderNew = this.orderRepository.save(order);
    if(throwEx){
      throw new RuntimeException("throw a ex");
    }
    return orderNew;
  }
}
知識がひろがる
1.伝統的なjpa方式を採用すれば、@EnbaleJparepositoriesは配置する必要がなく、配置しても影響がありません。実現方法は以下の通りです。
ds 1関連DaoImpl
@Persistence Contect
prvate EntityManager;
ds 2関連DaoImpl
@PersistencContect(unitName=「secondDs」)
prvate EntityManager;
ds 1のentityMangerは@Primaryを声明していますので、unitNameを指定する必要はありません。ds 2は必ず指定してください。正確なentityManagerを注入すれば、直接にデータベースを操作することができます。service層は上と同じで、@Transactional(「xxManager」)は事物管理器を指定すればいいです。
2.jdbcTemplate方式を採用して、直接Service層のオブジェクトに注入すればいいです。so easuy!
@Autowired
prvate JdbcTemplate jdbcTemplate;
@Autowired
prvate Transaction Template trantionTemplate;
@Resource(name=「jdbcTemplate 2」)
prvate JdbcTemplate jdbcTemplate 2;
@Resource(name=「tractionTemplate 2」)
privte Transaction Template trantionTemplate 2;
はい、spring boot多データソース、完璧に解決します。また、3つのデータベース操作方法はすべてサポートされています。もう実践して証明しました。これは政府が提供する最善の実践です。公式文書だけは詳しく書かれていません。何日間か私を陥れました。これで、spring bootフレームの使用が一段落しました。
以上のこの解決spring boot 1.5.4配置の多データソースの問題は小編集が皆さんに提供したすべての内容です。参考にしていただければと思います。どうぞよろしくお願いします。