#spring-boot #docker #hibernate #maven-2 #java-11
#пружинный ботинок #docker #впасть в спящий режим #maven-2 #java-11
Вопрос:
Я постараюсь объяснить проблему как можно более понятно. Сначала позвольте мне дать вам некоторые подробности.
- У нас есть два отдельных репозитория, настроенных для двух разных баз данных: один Postgres, один MsSQL.
- Мы предполагаем, что дали правильную аннотацию 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. Можете ли вы уменьшить его до небольшого размера (т. Е. Только До суммы, которая выдает ошибку), чтобы он был намного менее сложным и гораздо более читаемым?