проблема с источником данных application.properties - PullRequest
1 голос
/ 05 апреля 2019

В моем текущем стремлении сделать сохранение в двух источниках данных работающим, я пытаюсь добавить два источника данных в мой файл application.properties, задав им пользовательские префиксы, как это сделано в официальной весенней документации: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources. Когда я делаю это и вставляю данные, которые не будут сохранены в базе данных mysql, я получаю пустые наборы данных и ошибку (см. Ниже). Однако, если я использую исходный префикс в источнике данных и измененный префикс в другой базе данных, он сохранится, но только в базе данных с неизменным префиксом.

Это моя конфигурация для пользователя (db1):

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

public class UserConfiguration {


    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.datasource.db1")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.db1.configuration")
    public HikariDataSource firstDataSource() {
        return firstDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();

    }

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean userEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(firstDataSource())
                .packages("User.class")//User.class
                .persistenceUnit("users")
                .build();
    }
}

конфигурация для продукта (db2)

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;


public class ProductConfiguration {

    @Bean
    @ConfigurationProperties(prefix="spring.datasource.db2")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.db2.configuration")
    public BasicDataSource secondDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder()
                .type(BasicDataSource.class).build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean productEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(secondDataSource())
                .packages("Product.class")//Product.class
                .persistenceUnit("products")
                .build();
    }
}

файл application.properties, который не работает

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

spring.datasource.db1.url=jdbc:mysql://localhost/db1?autoReconnect=true&useSSL=false
spring.datasource.db1.username=user
spring.datasource.db1.password=pass
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db1.configuration.maximum-pool-size=30

spring.datasource.db2.url=jdbc:mysql://localhost/db2?autoReconnect=true&useSSL=false
spring.datasource.db2.username=user
spring.datasource.db2.password=pass
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db2.max-total=30

ошибка

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

файл application.properties, который работает наполовину. Сохраняются только данные в 1 дБ.

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

spring.datasource.url=jdbc:mysql://localhost/db1?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.configuration.maximum-pool-size=30

spring.datasource.db2.url=jdbc:mysql://localhost/db2?autoReconnect=true&useSSL=false
spring.datasource.db2.username=user
spring.datasource.db2.password=pass
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db2.max-total=30

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test.multidb</groupId>
    <artifactId>multipledb</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
    </dependencies>

</project>

Так что мне остается верить, что мое приложение не принимает измененный префикс. Что мне здесь не хватает? Я пытался использовать разные версии зависимостей maven, разные обозначения драйверов, пытался добавить зависимость базы данных H2. Но я спотыкаюсь от ошибки к ошибке.

1 Ответ

0 голосов
/ 08 апреля 2019

Хорошо, попробуйте сделать это:

Вы должны разделить свои репозитории следующим образом:

src/main/java
- com.foobar   
  - user
    - domain
    - repo
  - products
    - domain
    - repo

В репо поместите свои интерфейсы @Repository и в домен ваших сущностей.

application.properties

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

spring.datasource.url=jdbc:mysql://localhost/db1?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.configuration.maximum-pool-size=30

db2.datasource.url=jdbc:mysql://localhost/db2?autoReconnect=true&useSSL=false
db2.datasource.username=user
db2.datasource.password=pass
db2.datasource.driver-class-name=com.mysql.jdbc.Driver
db2.datasource.max-total=30

Конфигурация для вашего DB1 (первый источник данных)

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.foobar.user.repo" }
)
public class UserConfiguration {

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

  @Primary
  @Bean(name = "entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
    return builder
      .dataSource(dataSource)
      .packages("com.foobar.user.domain")
      .persistenceUnit("userPU")
      .build();
  }

  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}

Конфигурация для вашего DB2 (Secondy datasource)

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "db2EntityManagerFactory",
  transactionManagerRef = "db2TransactionManager",
  basePackages = { "com.foobar.products.repo" }
)
public class ProductConfiguration {

  @Bean(name = "db2DataSource")
  @ConfigurationProperties(prefix = "db2.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean(name = "db2EntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean 
  db2EntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("barDataSource") DataSource dataSource) {
    return
      builder
        .dataSource(dataSource)
        .packages("com.foobar.products.domain")
        .persistenceUnit("productPU")
        .build();
  }
  @Bean(name = "db2TransactionManager")
  public PlatformTransactionManager db2TransactionManager(@Qualifier("db2EntityManagerFactory") EntityManagerFactory db2EntityManagerFactory) {
    return new JpaTransactionManager(db2EntityManagerFactory);
  }
}

надеюсь, что этопомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...