Skip to content

Commit cbdb725

Browse files
author
d.kovalev
committed
first commit
0 parents  commit cbdb725

File tree

17 files changed

+346
-0
lines changed

17 files changed

+346
-0
lines changed

build.gradle

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
plugins {
2+
id 'java-library'
3+
}
4+
5+
def springVersion = '5.3.20'
6+
def springDataJdbcVersion = '2.4.1'
7+
def javaxVersion = '1.3.2'
8+
def junitVersion = '5.8.2'
9+
def junitEngineVersion = '1.8.2'
10+
def lombokVersion = '1.18.24'
11+
def postgresqlVersion = '42.3.6'
12+
13+
subprojects {
14+
apply plugin: "java-library"
15+
16+
group 'org.test.multiple.databases'
17+
version '1.0-SNAPSHOT'
18+
19+
repositories {
20+
mavenCentral()
21+
}
22+
23+
dependencies {
24+
compileOnly ("org.projectlombok:lombok:$lombokVersion")
25+
implementation (
26+
"org.springframework:spring-context:$springVersion",
27+
"org.springframework.data:spring-data-jdbc:$springDataJdbcVersion",
28+
// for @PostConstruct annotation usage
29+
"javax.annotation:javax.annotation-api:$javaxVersion",
30+
"org.junit.jupiter:junit-jupiter-api:$junitVersion",
31+
"org.junit.jupiter:junit-jupiter-params:$junitVersion",
32+
"org.junit.platform:junit-platform-engine:$junitEngineVersion",
33+
"org.postgresql:postgresql:$postgresqlVersion"
34+
)
35+
testImplementation (
36+
"org.springframework:spring-test:$springVersion",
37+
"org.junit.jupiter:junit-jupiter-engine:$junitVersion"
38+
)
39+
annotationProcessor(
40+
"org.projectlombok:lombok:$lombokVersion"
41+
)
42+
}
43+
44+
test {
45+
useJUnitPlatform()
46+
}
47+
}

first-db-client/build.gradle

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.test.multiple.databases.first;
2+
3+
import org.springframework.beans.factory.annotation.Qualifier;
4+
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
@Qualifier
11+
@Retention(RetentionPolicy.RUNTIME)
12+
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
13+
public @interface First {
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.test.multiple.databases.first;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import lombok.experimental.Accessors;
6+
import lombok.experimental.FieldNameConstants;
7+
import org.springframework.data.annotation.Id;
8+
import org.springframework.data.relational.core.mapping.Column;
9+
import org.springframework.data.relational.core.mapping.Table;
10+
11+
@Data
12+
@Table("")
13+
@Accessors(chain = true)
14+
@Builder(toBuilder = true)
15+
@FieldNameConstants
16+
public class FirstDBEntity {
17+
//fields
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.test.multiple.databases.first;
2+
3+
import org.springframework.data.repository.PagingAndSortingRepository;
4+
import org.springframework.transaction.annotation.Transactional;
5+
6+
@First
7+
@Transactional(value = "firstTransactionManager")
8+
public interface FirstDBEntityRepository extends PagingAndSortingRepository<FirstDBEntity, String> {
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.test.multiple.databases.first;
2+
3+
import org.postgresql.ds.PGSimpleDataSource;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.context.annotation.Lazy;
7+
import org.springframework.data.jdbc.core.convert.*;
8+
import org.springframework.data.jdbc.core.dialect.JdbcArrayColumns;
9+
import org.springframework.data.jdbc.core.dialect.JdbcDialect;
10+
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
11+
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
12+
import org.springframework.data.jdbc.repository.config.DialectResolver;
13+
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
14+
import org.springframework.data.relational.core.dialect.Dialect;
15+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
16+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
17+
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
18+
import org.springframework.transaction.TransactionManager;
19+
20+
import javax.sql.DataSource;
21+
22+
@Configuration
23+
@EnableJdbcRepositories(jdbcOperationsRef = "firstNamedParameterJdbcOperations",
24+
transactionManagerRef = "firstTransactionManager",
25+
basePackages = "org.test.multiple.databases.first")
26+
public class FirstDbConfig extends AbstractJdbcConfiguration {
27+
@Bean
28+
@First
29+
DataSource firstDataSource() {
30+
PGSimpleDataSource source = new PGSimpleDataSource();
31+
source.setServerNames(new String[] { "xxx.xxx.x.x" });
32+
source.setPortNumbers(new int[] { 5434 });
33+
source.setDatabaseName("fist");
34+
source.setUser("user");
35+
source.setPassword("password");
36+
return source;
37+
}
38+
39+
@Bean
40+
@First
41+
NamedParameterJdbcOperations firstNamedParameterJdbcOperations(@First DataSource dataSource) {
42+
return new NamedParameterJdbcTemplate(dataSource);
43+
}
44+
45+
@Override
46+
@Bean
47+
@First
48+
public DataAccessStrategy dataAccessStrategyBean(@First NamedParameterJdbcOperations operations, JdbcConverter jdbcConverter,
49+
JdbcMappingContext context, Dialect dialect) {
50+
return new DefaultDataAccessStrategy(new SqlGeneratorSource(context, jdbcConverter, dialect), context,
51+
jdbcConverter, operations, new SqlParametersFactory(context, jdbcConverter, dialect),
52+
new InsertStrategyFactory(operations, new BatchJdbcOperations(operations.getJdbcOperations()), dialect));
53+
}
54+
55+
@Override
56+
@Bean
57+
@First
58+
public JdbcConverter jdbcConverter(JdbcMappingContext mappingContext, @First NamedParameterJdbcOperations operations,
59+
@Lazy RelationResolver relationResolver, JdbcCustomConversions conversions, Dialect dialect) {
60+
61+
JdbcArrayColumns arrayColumns = dialect instanceof JdbcDialect ? ((JdbcDialect) dialect).getArraySupport()
62+
: JdbcArrayColumns.DefaultSupport.INSTANCE;
63+
DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(operations.getJdbcOperations(), arrayColumns);
64+
65+
return new BasicJdbcConverter(mappingContext, relationResolver, conversions, jdbcTypeFactory,
66+
dialect.getIdentifierProcessing());
67+
}
68+
69+
@Override
70+
@Bean
71+
@First
72+
public Dialect jdbcDialect(@First NamedParameterJdbcOperations operations) {
73+
return DialectResolver.getDialect(operations.getJdbcOperations());
74+
}
75+
76+
@Bean
77+
@First
78+
TransactionManager firstTransactionManager(@First DataSource dataSource) {
79+
return new DataSourceTransactionManager(dataSource);
80+
}
81+
}

gradle/wrapper/gradle-wrapper.jar

58.4 KB
Binary file not shown.
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
distributionBase=GRADLE_USER_HOME
2+
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
4+
zipStoreBase=GRADLE_USER_HOME
5+
zipStorePath=wrapper/dists

second-db-client/build.gradle

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.test.multiple.databases.second;
2+
3+
import org.springframework.beans.factory.annotation.Qualifier;
4+
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
@Qualifier
11+
@Retention(RetentionPolicy.RUNTIME)
12+
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
13+
public @interface Second {
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.test.multiple.databases.second;
2+
3+
import org.springframework.data.repository.PagingAndSortingRepository;
4+
import org.springframework.transaction.annotation.Transactional;
5+
6+
@Second
7+
@Transactional(value = "secondTransactionManager")
8+
public interface SecondDBEntityRepository extends PagingAndSortingRepository<SecondDbEntity, String> {
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package org.test.multiple.databases.second;
2+
3+
import org.postgresql.ds.PGSimpleDataSource;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.context.annotation.Lazy;
7+
import org.springframework.data.jdbc.core.convert.*;
8+
import org.springframework.data.jdbc.core.dialect.JdbcArrayColumns;
9+
import org.springframework.data.jdbc.core.dialect.JdbcDialect;
10+
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
11+
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
12+
import org.springframework.data.jdbc.repository.config.DialectResolver;
13+
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
14+
import org.springframework.data.relational.core.dialect.Dialect;
15+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
16+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
17+
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
18+
import org.springframework.transaction.TransactionManager;
19+
20+
import javax.sql.DataSource;
21+
22+
@Configuration
23+
@EnableJdbcRepositories(jdbcOperationsRef = "firstNamedParameterJdbcOperations",
24+
transactionManagerRef = "secondTransactionManager",
25+
basePackages = "org.test.multiple.databases.second")
26+
public class SecondDbConfig extends AbstractJdbcConfiguration {
27+
@Bean
28+
@Second
29+
DataSource secondDataSource() {
30+
PGSimpleDataSource source = new PGSimpleDataSource();
31+
source.setServerNames(new String[] { "xxx.xxx.x.x" });
32+
source.setPortNumbers(new int[] { 5433 });
33+
source.setDatabaseName("second");
34+
source.setUser("user");
35+
source.setPassword("password");
36+
return source;
37+
}
38+
39+
@Bean
40+
@Second
41+
NamedParameterJdbcOperations secondNamedParameterJdbcOperations(@Second DataSource dataSource) {
42+
return new NamedParameterJdbcTemplate(dataSource);
43+
}
44+
45+
@Override
46+
@Bean
47+
@Second
48+
public DataAccessStrategy dataAccessStrategyBean(@Second NamedParameterJdbcOperations operations, JdbcConverter jdbcConverter,
49+
JdbcMappingContext context, Dialect dialect) {
50+
return new DefaultDataAccessStrategy(new SqlGeneratorSource(context, jdbcConverter, dialect), context,
51+
jdbcConverter, operations, new SqlParametersFactory(context, jdbcConverter, dialect),
52+
new InsertStrategyFactory(operations, new BatchJdbcOperations(operations.getJdbcOperations()), dialect));
53+
}
54+
55+
@Override
56+
@Bean
57+
@Second
58+
public JdbcConverter jdbcConverter(JdbcMappingContext mappingContext, @Second NamedParameterJdbcOperations operations,
59+
@Lazy RelationResolver relationResolver, JdbcCustomConversions conversions, Dialect dialect) {
60+
61+
JdbcArrayColumns arrayColumns = dialect instanceof JdbcDialect ? ((JdbcDialect) dialect).getArraySupport()
62+
: JdbcArrayColumns.DefaultSupport.INSTANCE;
63+
DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(operations.getJdbcOperations(), arrayColumns);
64+
65+
return new BasicJdbcConverter(mappingContext, relationResolver, conversions, jdbcTypeFactory,
66+
dialect.getIdentifierProcessing());
67+
}
68+
69+
@Override
70+
@Bean
71+
@Second
72+
public Dialect jdbcDialect(@Second NamedParameterJdbcOperations operations) {
73+
return DialectResolver.getDialect(operations.getJdbcOperations());
74+
}
75+
76+
@Bean
77+
@Second
78+
TransactionManager secondTransactionManager(@Second DataSource dataSource) {
79+
return new DataSourceTransactionManager(dataSource);
80+
}
81+
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.test.multiple.databases.second;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
import lombok.experimental.Accessors;
6+
import lombok.experimental.FieldNameConstants;
7+
import org.springframework.data.annotation.Id;
8+
import org.springframework.data.relational.core.mapping.Column;
9+
import org.springframework.data.relational.core.mapping.Table;
10+
11+
import java.time.Instant;
12+
import java.util.UUID;
13+
14+
@Data
15+
@Table("")
16+
@Accessors(chain = true)
17+
@Builder(toBuilder = true)
18+
@FieldNameConstants
19+
public class SecondDbEntity {
20+
//fields
21+
}

settings.gradle

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
rootProject.name = 'multiple-databases'
2+
include 'first-db-client'
3+
include 'second-db-client'
4+
include 'tests'
5+

tests/build.gradle

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
dependencies {
2+
api project(":first-db-client")
3+
api project(":second-db-client")
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.test.multiple.databases.tests;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.context.annotation.Import;
5+
import org.test.multiple.databases.first.FirstDbConfig;
6+
import org.test.multiple.databases.second.SecondDbConfig;
7+
8+
@Configuration
9+
@Import({
10+
FirstDbConfig.class,
11+
SecondDbConfig.class
12+
})
13+
public class TestConfig {
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import org.junit.jupiter.api.Test;
2+
import org.junit.jupiter.api.extension.ExtendWith;
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.test.context.ContextConfiguration;
5+
import org.springframework.test.context.junit.jupiter.SpringExtension;
6+
import org.test.multiple.databases.first.FirstDBEntityRepository;
7+
import org.test.multiple.databases.second.SecondDBEntityRepository;
8+
import org.test.multiple.databases.tests.TestConfig;
9+
10+
@ExtendWith(SpringExtension.class)
11+
@ContextConfiguration(classes = TestConfig.class)
12+
class MultipleDatabasesTest {
13+
@Autowired
14+
FirstDBEntityRepository firstDBEntityRepository;
15+
@Autowired
16+
SecondDBEntityRepository secondDBEntityRepository;
17+
18+
@Test
19+
void test() {
20+
firstDBEntityRepository.findAll();
21+
secondDBEntityRepository.findAll();
22+
}
23+
}

0 commit comments

Comments
 (0)