[英]Spring Data JPA Multiple DataSources - CockroachDb Spatial
我的应用程序有两个数据源。 首先使用 JdbcTemplate 访问 Postgre 数据源。 第二个数据源使用 Spring 数据 JPA 访问 CockroachDb。
所以我为这个数据源创建了两个配置。
坚持两个数据源都可以正常工作,但具有空间数据的对象除外。 当我尝试将空间数据保存到 CockroachDb 时,出现错误:
Hibernate: select geoobject0_.id as id1_2_0_, geoobject0_.address as address2_2_0_, geoobject0_.address_id as address_3_2_0_, geoobject0_.created as created4_2_0_, geoobject0_.flat_count as flat_cou5_2_0_, geoobject0_.geo_provider_id as geo_prov6_2_0_, geoobject0_.geometry as geometry7_2_0_, geoobject0_.hq_id as hq_id8_2_0_ , geoobject0_.is_generated as is_gener9_2_0_, geoobject0_.is_living as is_livi10_2_0_, geoobject0_.payload as payload11_2_0_, geoobject0_.source_id as source_12_2_0_, geoobject0_.type as type13_2_0_, geoobject0_.uic_id as uic_id14_2_0_, geoobject0_.version_id as version15_2_0_, geoobject0_.voter_count as voter_c16_2_0_ from geo_service .geo_object geoobject0_ 其中 geoobject0_.id=? Hibernate:插入geo_service.geo_object(地址,address_id,created,flat_count,geo_provider_id,geometry,hq_id,is_generated,is_living,payload,source_id,type,uic_id,version_id,voter_count,id)值(?,?,?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 2022-01-18 17:01:39.583 [ForkJoinPool.commonPool-worker-3] WARN ohejdbc.spi.SqlExceptionHelper logExceptions () - SQL Error: 0, SQLState: XXUUU 2022-01-18 17:01:39.584 [ForkJoinPool.commonPool-worker-3] ERROR ohejdbc.spi.SqlExceptionHelper logExceptions() - ERROR: wkb: unknown byte order: 10101100
Java配置:
对于 Postgre:
@Configuration
public class UicDbConfig {
@Bean(name = "uicDataSource")
@Qualifier("uicDataSource")
@Primary
@ConfigurationProperties(prefix="spring.uic.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
对于 CockroachDb:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "ru.stimul.geoservice.repo",
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager")
public class CockroachDbConfig {
@Autowired
private Environment env;
@Bean("primaryDataSource")
@ConfigurationProperties(prefix="spring.primary.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder
,@Qualifier("primaryDataSource") DataSource primaryDataSource){
LocalContainerEntityManagerFactoryBean em = builder
.dataSource(primaryDataSource)
.packages("ru.stimul.geoservice.domain.primary")
.persistenceUnit("domains")
.build();
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
@Bean(name = "primaryTransactionManager")
public JpaTransactionManager transactionManager(@Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(primaryEntityManagerFactory);
return transactionManager;
}
private Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", env.getProperty("spring.primary.jpa.properties.hibernate.dialect"));
properties.setProperty("hibernate.show_sql", env.getProperty("spring.primary.jpa.show-sql"));
return properties;
}
}
应用程序.yml:
spring:
application.name: geo-service
http:
encoding:
charset: UTF-8
enabled: true
main:
allow-bean-definition-overriding: true
primary:
datasource:
jdbcUrl: jdbc:postgresql://localhost:26257/geo_service
driverClassName: org.postgresql.Driver
username: admin
password:
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate:
dialect: org.hibernate.spatial.dialect.cockroachdb.CockroachDB202SpatialDialect
generate-ddl: false
uic:
datasource:
jdbc-url: "jdbc:postgresql://localhost:2222/uic"
driverClassName: org.postgresql.Driver
username: postgres
password:
schema:
hikari:
connectionTimeout: 20000
maximumPoolSize: 10
max-active: 3
initial-size: 1
max-idle: 2
min-idle: 1
test-while-idle: true
test-on-borrow: true
max-idle-time: 160000
max-lifetime: 0
域 object:
import com.vividsolutions.jts.geom.Point;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import ru.stimul.geoservice.Geo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "geo_object", schema = "geo_service")
@Slf4j
public class GeoObject {
@Id
@Column
String id;
@Column
Long created;
@Column(name = "version_id")
String versionId;
@Column(name = "hq_id")
String hqId;
@Column(name = "source_id")
String sourceId;
@Column(name = "geo_provider_id")
String geoProviderId;
@Column(name = "uic_id")
String uicId;
@Column(name = "address_id")
String addressId;
Point geometry;
@Column
String address;
@Column
String type;
@Column(name = "flat_count")
Long flatCount;
@Column(name = "voter_count")
Long voterCount;
@Column(name = "is_living")
boolean isLiving;
@Column(name = "is_generated")
boolean isGenerated;
@Column(length = 2000)
String payload;
}
存储库:
package ru.stimul.geoservice.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.stimul.geoservice.domain.primary.GeoObject;
@Repository
public interface CockroachDbRepository extends JpaRepository<GeoObject, String> {
}
服务:
public GeoObject upsertWithoutAccessCheck(String requestId, GeoObject geoObject) {
if (Objects.isNull(geoObject.getId()) || StringUtils.isEmpty(geoObject.getId())) {
geoObject = geoObject.toBuilder()
.id(UUID.randomUUID().toString())
.build();
}
return cockroachDbRepository.saveAndFlush(geoObject);
}
pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.33.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>5.4.33.Final</version>
</dependency>
我建议您使用 Hikari 来处理多个数据源。
@Configuration
@ConfigurationProperties(prefix = "first.datasource")
@EnableTransactionManagement
public class FirstDBConfig extends HikariConfig {
@Bean
public DataSource firstDataSource() {
return new HikariDataSource(this);
}
...........................................
@Configuration
@ConfigurationProperties(prefix = "second.datasource")
@EnableTransactionManagement
@EnableJpaRepositories( basePackages = {
"com.myproyect.repos"
},
entityManagerFactoryRef = "myEntityManager",
transactionManagerRef = "myTransactionManager")
public class SecondDBConfig extends HikariConfig {
@Bean
public DataSource secondDataSource() {
return new HikariDataSource(this);
}
有关更多详细信息,请阅读有关 hikari
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.