2016-11-02 11 views
0

ここに私のケースです: 私は2つのデータベースを持っています:1つのsybaseと1つのmssql。私は単一のサービスクラスの両方のデータベースにアクセスしたいと思います。たとえば、sybaseからいくつかのデータを取得したいとしたら、mssqlでいくつかの更新を行う必要があります。1つのサービスクラスでjdbcTemplatesで複数のデータソースにアクセス

オンラインで見つかった複数のサンプルに基づいて2つのデータソースをセットアップしましたが、私の2番目のデータベース(sybase)にアクセスできません。

pom.xml

spring.mvc.view.prefix: /WEB-INF/jsp/ 
spring.mvc.view.suffix: .jsp 


# Database 
# spring.datasource.jndi-name=jdbc/database1 
spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver 
spring.datasource.url=jdbc:jtds:sqlserver://database1/db_aes 
spring.datasource.username=user1 
spring.datasource.password=password1 

# Keep the connection alive if idle for a long time (needed in production) 
spring.datasource.testWhileIdle = true 
spring.datasource.validationQuery = SELECT 1 

# 2nd Database 
spring.secondDatasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver 
spring.secondDatasource.url=jdbc:jtds:sybase://database2/aidcconfig 
spring.secondDatasource.username=user2 
spring.secondDatasource.password=password2 
spring.secondDatasource.hibernate.dialect = org.hibernate.dialect.SybaseASE15Dialect 
spring.secondDatasource.testWhileIdle = true 
spring.secondDatasource.validationQuery = SELECT 1 


# Show or not log for each sql query 
spring.jpa.show-sql = false 

# Hibernate ddl auto (create, create-drop, update, validate) 
spring.jpa.hibernate.ddl-auto = validate 

# Naming strategy 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.EJB3NamingStrategy 

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is 
# stripped before adding them to the entity manager) 

# The SQL dialect makes Hibernate generate better SQL for the chosen database 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServerDialect 

com.ibm.websphere.persistence.ApplicationsExcludedFromJpaProcessing=* 

fileUploadServiceImpl

@Component("fileUploadService") 
@Transactional 
public class FileUploadServiceImpl implements FileUploadService { 

    @Autowired 
    @Qualifier("dbAesJdbcTemplate") 
    JdbcTemplate dbAesJdbcTemplate; 

    @Autowired 
    @Qualifier("aidcconfigJdbcTemplate") 
    JdbcTemplate aidcconfigJdbcTemplate; 

    private int uploadId = 1; 

    private void testDB(){ 
      String db = aidcconfigJdbcTemplate.queryForObject("select db_name()", String.class); 
      System.out.println("database name: " + db); 
    } 
... 
} 

DbAesDataSource

package config.database; 

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "dbAesEntityManagerFactory", 
     transactionManagerRef = "dbAesTransactionManager", 
     basePackages = {"web.fileUpload.repo.db_aes.dao"} 
     ) 
public class DbAesDataSource { 

    @Primary 
    @Bean(name="dbAesDataSource") 
    @ConfigurationProperties(prefix = "spring.datasource") 
    public DataSource dbAesDataSource(){ 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name="dbAesJdbcTemplate") 
    public JdbcTemplate dbAesJdbcTemplate(@Qualifier("dbAesDataSource") DataSource dbAesDataSource) 
    { 
     return new JdbcTemplate(dbAesDataSource); 
    } 

    @Bean(name="dbAesEntityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean dbAesEntityManagerFactory(
      EntityManagerFactoryBuilder builder, 
      @Qualifier("dbAesDataSource") DataSource dbAesDataSource) { 
     return builder 
       .dataSource(dbAesDataSource) 
       .packages("web.fileUpload.repo.db_aes.models") 
       .build(); 
    } 

    @Bean(name = "dbAesTransactionManager") 
    public PlatformTransactionManager dbAesTransactionManager(
      @Qualifier("dbAesEntityManagerFactory") EntityManagerFactory dbAesEntityManagerFactory) { 
     return new JpaTransactionManager(dbAesEntityManagerFactory); 
    } 
} 

AidcconfigDataSource

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "aidcconfigEntityManagerFactory", 
     transactionManagerRef = "aidcconfigTransactionManager", 
     basePackages = {"web.fileUpload.repo.aidcconfig.dao"} 
     ) 
public class AidcconfigDataSource { 

    @Bean(name="aidcconfigDataSource") 
    @ConfigurationProperties(prefix = "spring.secondDatasource") 
    public DataSource aidcconfigDataSource(){ 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean(name="aidcconfigJdbcTemplate") 
    public JdbcTemplate aidcconfigJdbcTemplate(@Qualifier("aidcconfigDataSource") DataSource aidcconfigDataSource) 
    { 
     return new JdbcTemplate(aidcconfigDataSource); 
    } 

    @Bean(name="aidcconfigEntityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean aidcconfigEntityManagerFactory(
      EntityManagerFactoryBuilder builder, 
      @Qualifier("aidcconfigDataSource") DataSource aidcconfigDataSource) { 
     return builder 
       .dataSource(aidcconfigDataSource) 
       .packages("web.fileUpload.repo.aidcconfig.models") 
       .build(); 
    } 

    @Bean(name = "aidcconfigTransactionManager") 
    public PlatformTransactionManager aidcconfigTransactionManager(
      @Qualifier("aidcconfigEntityManagerFactory") EntityManagerFactory aidcconfigEntityManagerFactory) { 
     return new JpaTransactionManager(aidcconfigEntityManagerFactory); 
    } 
} 

H:ここで

は私のコードですEREは私のエラーです:私はFileUploadServiceImplで予選を取り外した場合

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.5.RELEASE:run (default-cli) on 
project testUpload: An exception occurred while running. null: InvocationTargetException: Error creating bean with 
name 'fileDownloadController': Injection of autowired dependencies failed; nested exception is org.springframework 
.beans.factory.BeanCreationException: Could not autowire field: private web.fileUpload.services.FileUploadService w 
eb.fileUpload.controller.FileDownloadController.fileUploadService; nested exception is org.springframework.beans.fa 
ctory.BeanCreationException: Error creating bean with name 'fileUploadService': Injection of autowired dependencies 
failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org 
.springframework.jdbc.core.JdbcTemplate web.fileUpload.services.FileUploadServiceImpl.dbAesJdbcTemplate; nested exc 
eption is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springfr 
amework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidat 
e for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=tr 
ue), @org.springframework.beans.factory.annotation.Qualifier(value=dbAesJdbcTemplate)} -> [Help 1] 

、その後、任意のjdbcTemplateはdb_aesある私のプライマリ・データベースに接続します。 jdbcTemplateを使用して2番目のデータソースにアクセスするにはどうすればよいですか?私はBeanを作成することができないことに気づいた、と私はいくつかを置い Spring Boot, Spring Data JPA with multiple DataSources

https://www.infoq.com/articles/Multiple-Databases-with-Spring-Boot

Multiple DataSource and JdbcTemplate in Spring Boot (> 1.1.0)

試作#1 :後

は、私が使用参照の一部ですAidcconfigDataSourceクラスのロガー。その結果、私の方法が実行されているのが見えませんでした。したがって、私はアプリケーションが私のAidcconfigDataSourceクラスを読んでいないと仮定しました。

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.3.5.RELEASE:run (default-cli) on 
project testUpload: An exception occurred while running. null: InvocationTargetException: Error creating bean with 
name 'dataSourceInitializerPostProcessor': Injection of autowired dependencies failed; nested exception is org.spr 
ingframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.beans.facto 
ry.BeanFactory org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerPostProcessor.beanFactory; nested e 
xception is org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'aidc 
configDataSource' defined in class path resource [web/config/database/AidcconfigDataSource.class]: factory-bean ref 
erence points back to the same bean definition -> [Help 1] 

試作#2

enter image description here

は今、私は別のエラーを持っている:

私は、java /ウェブ/設定するには、Java /コンフィグから、などのconfigフォルダを移転しました

私はbeanの名前をaidcconfigDataSourceからaidcconfigDSに変更し、プライマリdと同じに変更しましたatasource。さらに、私のapplication.propertiesに "spring.jpa.open_in_view = false"を追加しました。しかし、別のエラーが発生します。どのようにこれを正しい方法で行うには?

2016-11-03 09:28:16.118 ERROR 11412 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.servic 
e() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exce 
ption is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springf 
ramework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: dbAesTransa 
ctionManager,aidcconfigTransactionManager] with root cause 

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework. 
transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: dbAesTransactionMana 
ger,aidcconfigTransactionManager 
+0

あなたは、トランザクション・マネージャーの名前を指定せずにTransactional' @ '使用していますか?で、見て:http://stackoverflow.com/questions/8050183/enabletransactionmanagement-annotation-with-2-transaction-managers多分助けて – ilopezluna

答えて

1

私は春ブーツが同じ名前を持つ2つの豆をインスタンス化しようとしていると思う: aidcconfigDataSource

一つは、コンフィギュレーションクラスAidcconfigDataSource.classであり、もう一つはBeanです:

@Bean(name="aidcconfigDataSource") 
    @ConfigurationProperties(prefix = "spring.secondDatasource") 
    public DataSource aidcconfigDataSource(){ 
     return DataSourceBuilder.create().build(); 
    } 
+0

...私はconfigクラスのために同じ名前を与えるべきではないと言っているBeanの名前を変更する必要がありますか? – terencefung

+0

正解、私は前の例外が消滅する名前を変更すると思います – ilopezluna

関連する問題