Spring Boot 2.2.6 Java-приложение выполняет sql-запрос в неверной базе данных

#spring-boot #docker #hibernate #maven-2 #java-11

#пружинный ботинок #docker #впасть в спящий режим #maven-2 #java-11

Вопрос:

Я постараюсь объяснить проблему как можно более понятно. Сначала позвольте мне дать вам некоторые подробности.

  1. У нас есть два отдельных репозитория, настроенных для двух разных баз данных: один Postgres, один MsSQL.
  2. Мы предполагаем, что дали правильную аннотацию transactionmanager для этого самого запроса, который вы можете увидеть в приведенном ниже коде.

Одна из проблем заключается в том, что мы получаем ошибку «ОШИБКА: отношение «dbo.sometable» не существует», которая указывает на выполнение в неверной базе данных (postgres), и мы подтвердили это, проверив pg_log.

И вот большая проблема. Приведенная выше ошибка возникает не при каждой сборке. Каждая сборка либо выполняет запрос к «правильной», либо к «неправильной» базе данных, и это поведение заключается в том, что для каждого изображения контейнера, несмотря на то, сколько раз мы его убиваем или пытаем, оно никогда не меняется.

Конфигурация источника данных:

         import org.springframework.beans.factory.annotation.Qualifier;
        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.Configuration;
        import org.springframework.context.annotation.Primary;
        import org.springframework.context.annotation.Profile;
        import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
        import org.springframework.orm.jpa.JpaTransactionManager;
        import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
        import org.springframework.transaction.PlatformTransactionManager;
        import org.springframework.transaction.annotation.EnableTransactionManagement;
        
        import javax.persistence.EntityManager;
        import javax.persistence.EntityManagerFactory;
        import javax.sql.DataSource;
        
        @Profile("!indexer")
        @Configuration
        @EnableTransactionManagement
        @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryRef",
                               transactionManagerRef = "transactionManagerRef",
                               basePackages = { "com.xxx.consumers.handlers.payment.provider.xxx.repository" })
        public class OrganizerDatasourceConfiguration {
        
            @Bean(name = "zzzEntityManager")
            public EntityManager entityManager(@Qualifier("zzzEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
                return entityManagerFactory.createEntityManager();
            }
        
            @Bean(name = "zzzDataSourceProperties")
            @ConfigurationProperties("zzz.datasource")
            public DataSourceProperties zzzDataSourceProperties() {
                return new DataSourceProperties();
            }
        
            @Bean(name = "zzzDataSource")
            @ConfigurationProperties(prefix = "zzz.datasource.tomcat")
            public DataSource zzzDataSource() {
                return zzzDataSourceProperties().initializeDataSourceBuilder().type(org.apache.tomcat.jdbc.pool.DataSource.class).build();
            }
        
            @Bean(name = "zzzEntityManagerFactory")
            public LocalContainerEntityManagerFactoryBean zzzEntityManagerFactory(EntityManagerFactoryBuilder builder,
                                                                                        @Qualifier("zzzDataSource") DataSource organizerDataSource) {
                return builder.dataSource(zzzDataSource)
                              .packages("com.xxx.consumers.handlers.zzz")
                              .persistenceUnit("organizer")
                              .build();
            }
        
            @Bean(name = "zzzTransactionManager")
            public PlatformTransactionManager zzzTransactionManager(
                    @Qualifier("zzzEntityManagerFactory") EntityManagerFactory zzzEntityManagerFactory) {
                return new JpaTransactionManager(zzzEntityManagerFactory);
            }
        }

 

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>
            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.6.RELEASE</version>
                <relativePath/> <!-- lookup parent from repository -->
            </parent>

            <groupId>com.xxx</groupId>
            <artifactId>consumers</artifactId>
            <version>1.3.3.1</version>
            <packaging>jar</packaging>

            <properties>
                <elasticsearch.version>7.8.0</elasticsearch.version>
                <java.version>11</java.version>
                <legacy-data.version>3.0.0</legacy-data.version>
                <spring.boot.version>2.2.6.RELEASE</spring.boot.version>
                <jackson.version>2.8.7</jackson.version>
                <postgre.version>42.2.5</postgre.version>
                <spring.rabbitmq.version>2.2.7.RELEASE</spring.rabbitmq.version>
                <asynchttpclient.version>2.5.4</asynchttpclient.version>
                <redisson.version>3.12.2</redisson.version>
                <lombok.version>1.18.2</lombok.version>
                <mapstruct.version>1.2.0.Final</mapstruct.version>
                <forcerest.version>0.0.40</forcerest.version>
                <hibernate-type.version>2.3.0</hibernate-type.version>
                <mssqlserver.version>8.2.2.jre11</mssqlserver.version>
                <janino.version>3.0.6</janino.version>
                <logstash-logback.version>5.2</logstash-logback.version>
                <maven.compiler-plugin.version>3.8.1</maven.compiler-plugin.version>
                <google.cloud.version>1.111.2</google.cloud.version>
            </properties>

            <dependencies>
                <dependency>
                    <groupId>com.google.cloud</groupId>
                    <artifactId>google-cloud-storage</artifactId>
                    <version>${google.cloud.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                    <version>${elasticsearch.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-high-level-client</artifactId>
                    <version>${elasticsearch.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                    <version>${elasticsearch.version}</version>
                </dependency>
               
                <!-- SPRING-BOOT -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-actuator</artifactId>
                    <version>${spring.boot.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.amqp</groupId>
                    <artifactId>spring-rabbit</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-openfeign</artifactId>
                    <version>2.2.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
                </dependency>

                <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.datatype</groupId>
                    <artifactId>jackson-datatype-jdk8</artifactId>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.datatype</groupId>
                    <artifactId>jackson-datatype-joda</artifactId>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.datatype</groupId>
                    <artifactId>jackson-datatype-jsr310</artifactId>
                </dependency>

                <dependency>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                    <version>${postgre.version}</version>
                </dependency>

                <dependency>
                    <groupId>com.frejo</groupId>
                    <artifactId>force-rest-api</artifactId>
                    <version>${forcerest.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.asynchttpclient</groupId>
                    <artifactId>async-http-client</artifactId>
                    <version>${asynchttpclient.version}</version>
                </dependency>

                <dependency>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-jdk8</artifactId>
                    <version>${mapstruct.version}</version>
                </dependency>

                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-java8</artifactId>
                </dependency>
                <dependency>
                    <groupId>com.vladmihalcea</groupId>
                    <artifactId>hibernate-types-5</artifactId>
                    <version>${hibernate-type.version}</version>
                </dependency>

                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                    <scope>compile</scope>
                </dependency>

                <dependency>
                    <groupId>javax.xml.bind</groupId>
                    <artifactId>jaxb-api</artifactId>
                    <version>2.3.1</version>
                </dependency>
                <dependency>
                    <groupId>com.sun.xml.bind</groupId>
                    <artifactId>jaxb-core</artifactId>
                    <version>2.3.0.1</version>
                </dependency>
                <dependency>
                    <groupId>com.sun.xml.bind</groupId>
                    <artifactId>jaxb-impl</artifactId>
                    <version>2.3.2</version>
                </dependency>

                <dependency>
                    <groupId>net.logstash.logback</groupId>
                    <artifactId>logstash-logback-encoder</artifactId>
                    <version>${logstash-logback.version}</version>
                </dependency>

                <dependency>
                    <groupId>com.microsoft.sqlserver</groupId>
                    <artifactId>mssql-jdbc</artifactId>
                    <version>${mssqlserver.version}</version>
                </dependency>

                <dependency>
                    <groupId>org.codehaus.janino</groupId>
                    <artifactId>janino</artifactId>
                    <version>${janino.version}</version>
                </dependency>

                <!-- TEST -->
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.mockito</groupId>
                    <artifactId>mockito-core</artifactId>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                </dependency>
            </dependencies>

            <dependencyManagement>
                <dependencies>
                    <dependency>
                        <groupId>com.xxx</groupId>
                        <artifactId>xxx-dependencies</artifactId>
                        <version>2.0.0</version>
                        <type>pom</type>
                        <scope>import</scope>
                    </dependency>
                </dependencies>
            </dependencyManagement>

            <build>
                <finalName>consumers</finalName>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>2.2.6.RELEASE</version>
                    </plugin>

                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>${maven-compiler-plugin.version}</version>
                        <configuration>
                            <source>${java.version}</source>
                            <target>${java.version}</target>
                        </configuration>
                    </plugin>
                </plugins>
            </build>

            

            <distributionManagement>
                <snapshotRepository>
                    <id>xxx-snapshots</id>
                    <url>:snapshot-url</url>
                </snapshotRepository>
                <repository>
                    <id>xxx-releases</id>
                    <url>:release-url</url>
                </repository>
            </distributionManagement>

            <profiles>
                <profile>
                    <id>sonar</id>
                    <activation>
                        <activeByDefault>false</activeByDefault>
                    </activation>
                   
                    <build>
                        <plugins>
                            <plugin>
                                <groupId>org.sonarsource.scanner.maven</groupId>
                                <artifactId>sonar-maven-plugin</artifactId>
                            </plugin>
                        </plugins>
                    </build>
                </profile>
            </profiles>


        </project>
 
 import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Repository
public interface OpportunityPaymentInstallmentRepository extends JpaRepository<OpportunityPaymentInstallment, Long> {

    @Transactional(value = "organizerTransactionManager", readOnly = true, propagation = Propagation.REQUIRES_NEW)
    Optional<OpportunityPaymentInstallment> getByPaymentInstallmentId(Long paymentInstallmentId);

}
 

Комментарии:

1. Можете ли вы уменьшить его до небольшого размера (т. Е. Только До суммы, которая выдает ошибку), чтобы он был намного менее сложным и гораздо более читаемым?