Spring Boot 2.2.6 Java 应用程序在错误的数据库上执行 sql 查询

问题描述

我会尽量清楚地解释这个问题。首先让我给你一些细节。

  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);

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)