spring boot下基于spring data jpa配置mysql+达梦多数据源(以不同包路径方式,mysql为主数据源)

这篇具有很好参考价值的文章主要介绍了spring boot下基于spring data jpa配置mysql+达梦多数据源(以不同包路径方式,mysql为主数据源)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


关键词:mysql 达梦/dameng jpa 多数据源

版本信息/主要引包信息

spring boot:2.1.17.RELEASE
mysql驱动:8.0.21(跟随boot版本)
达梦驱动:8.1.2.192
lombok:1.18.12(跟随boot版本)

背景概述

  • 以mysql为主数据源,达梦为第二数据源方式配置
  • 适用于旧项目二次开发接入达梦数据库或基于通用二方/三方包做业务扩展等场景
  • 将以不同包路径方式绑定不同数据源,以便扩展

代码示例

  • 其中,primary为主数据源,second为第二数据源

引包部分(pom.xml)

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

	<groupId>org</groupId>
	<artifactId>test-jpa-tra</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>test-jpa-tra</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-boot.version>2.1.17.RELEASE</spring-boot.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<!-- 数据库驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>com.dameng</groupId>
			<artifactId>DmJdbcDriver18</artifactId>
			<version>8.1.2.192</version>
		</dependency>
		<dependency>
			<groupId>com.dameng</groupId>
			<artifactId>DmDialect-for-hibernate5.3</artifactId>
			<version>8.1.2.192</version>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

实体部分(Entity)

主数据源:

package org.test.data.entity.primary;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "test")
public class Test {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	private String name;
}

第二数据源:

package org.test.data.entity.second;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "test2")
public class Test2 {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	private String name;
}

数据库接口部分(Repository)

主数据源:

package org.test.dao.primary;

import org.springframework.stereotype.Repository;
import org.test.data.entity.primary.Test;

import org.springframework.data.jpa.repository.JpaRepository;

@Repository
public interface TestRepository extends JpaRepository<Test, Integer> {
}

第二数据源:

package org.test.dao.second;

import org.springframework.stereotype.Repository;
import org.test.data.entity.second.Test2;

import org.springframework.data.jpa.repository.JpaRepository;

@Repository
public interface TestRepository2 extends JpaRepository<Test2, Integer> {
}

服务接口部分(Service)

此处略,可按实际项目关联,服务部分可无需区分包路径

配置部分(Configuration)

此处将配置数据库配置读取数据源EntityManager构造工厂以及事务管理器
主数据源:

package org.test.property.config;

import java.util.HashMap;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

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.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Primary;
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 org.springframework.util.StringUtils;

import com.zaxxer.hikari.HikariDataSource;

@Configuration
@EnableTransactionManagement // 开启事务
@EnableJpaRepositories(basePackages = { "org.test.dao.primary" },
		entityManagerFactoryRef = "primaryEntityManagerFactory", 
		transactionManagerRef = "primaryTransactionManager" 
)
public class TestPrimaryDataSourceConfig {
	/**
	 * 指定 primary 数据源的 dataSource 配置
	 *
	 * @return primary 数据源配置
	 */
	@Primary
	@Bean(name = "primaryDataSourceProperties")
	@ConfigurationProperties("spring.datasource.primary") 
	public DataSourceProperties dataSourceProperties() {
		return new DataSourceProperties();
	}

	/**
	 * 可以选择不同的数据源,这⾥使⽤ HikariDataSource,创建数据源
	 *
	 * @param primaryDataSourceProperties
	 *            数据源配置
	 * @return primary 数据源
	 */
	@Primary
	@Bean(name = "primaryDataSource")
	@ConfigurationProperties(prefix = "spring.datasource.hikari.primary") // 配置
																			// primary
																			// 数据源所⽤的
																			// hikari
																			// 配置
																			// key
																			// 的前缀
	public DataSource dataSource(
			@Qualifier("primaryDataSourceProperties") DataSourceProperties primaryDataSourceProperties) {
		HikariDataSource dataSource = primaryDataSourceProperties.initializeDataSourceBuilder()
				.type(HikariDataSource.class).build();
		if (StringUtils.hasText(primaryDataSourceProperties.getName())) {
			dataSource.setPoolName(primaryDataSourceProperties.getName());
		}
		return dataSource;
	}

	/**
	 * 配置 primary 数据源的 entityManagerFactory 命名为
	 * primaryEntityManagerFactory,⽤来对实体进⾏⼀些操作
	 *
	 * @param builder
	 *            构建器
	 * @param primaryDataSource
	 *            primary 数据源
	 * @return primary 实体管理工厂
	 */
	@Primary
	@Bean(name = "primaryEntityManagerFactory")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
			@Qualifier("primaryDataSource") DataSource primaryDataSource) {
		final HashMap<String, Object> hibernateProperties = new HashMap<String, Object>();
		hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
		return builder.dataSource(primaryDataSource).properties(hibernateProperties)
				// primary 数据的实体所在的路径
				.packages("org.test.data.entity.primary")
				// persistenceUnit 的名字采⽤ primary
				.persistenceUnit("primary").build();
	}

	/**
	 * 配置 primary 数据源的事务管理者,命名为 primaryTransactionManager 依赖
	 * primaryEntityManagerFactory
	 *
	 * @param primaryEntityManagerFactory
	 *            primary 实体管理工厂
	 * @return primary 事务管理者
	 */
	@Primary
	@Bean(name = "primaryTransactionManager")
	public PlatformTransactionManager transactionManager(
			@Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) {
		return new JpaTransactionManager(primaryEntityManagerFactory);
	}
}

第二数据源:

package org.test.property.config;

import java.util.HashMap;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

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.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
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 org.springframework.util.StringUtils;

import com.zaxxer.hikari.HikariDataSource;

@Configuration
@EnableTransactionManagement // 开启事务
@EnableJpaRepositories( // 利⽤ EnableJpaRepositories 配置哪些包下⾯的 Repositories,采⽤哪个
						// EntityManagerFactory 和哪个 TransactionManagement
		basePackages = { "org.test.dao.second" },
		entityManagerFactoryRef = "secondEntityManagerFactory", 
		transactionManagerRef = "secondTransactionManager" 
)
public class TestSecondDataSourceConfig {

	/**
	 * 指定 second 数据源的 dataSource 配置
	 *
	 * @return second 数据源配置
	 */
	@Bean(name = "secondDataSourceProperties")
	// @Qualifier(value = "secondDataSourceProperties")
	@ConfigurationProperties("spring.datasource.second") // second 数据源的配置前缀采⽤
														// spring.datasource.second
	public DataSourceProperties secondDataSourceProperties() {
		return new DataSourceProperties();
	}

	/**
	 * 可以选择不同的数据源,这⾥使⽤ HikariDataSource,创建数据源
	 *
	 * @param secondDataSourceProperties
	 *            数据源配置
	 * @return second 数据源
	 */
	@Bean(name = "secondDataSource")
	// @Qualifier(value = "secondDataSource")
	@ConfigurationProperties(prefix = "spring.datasource.hikari.second") // 配置
																		// second
																		// 数据源所⽤的
																		// hikari
																		// 配置
																		// key
																		// 的前缀
	public DataSource dataSource() {
		DataSourceProperties secondDataSourceProperties = secondDataSourceProperties();
		HikariDataSource dataSource = secondDataSourceProperties.initializeDataSourceBuilder()
				.type(HikariDataSource.class).build();
		if (StringUtils.hasText(secondDataSourceProperties.getName())) {
			dataSource.setPoolName(secondDataSourceProperties.getName());
		}
		return dataSource;
	}

	/**
	 * 配置 second 数据源的 entityManagerFactory 命名为
	 * secondEntityManagerFactory,⽤来对实体进⾏⼀些操作
	 *
	 * @param builder
	 *            构建器
	 * @param secondDataSource
	 *            second 数据源
	 * @return second 实体管理工厂
	 */
	@Bean(name = "secondEntityManagerFactory")
	// @Qualifier(value = "secondEntityManagerFactory")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
		final HashMap<String, Object> hibernateProperties = new HashMap<String, Object>();
		hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.DmDialect");
		return builder.dataSource(dataSource()).properties(hibernateProperties)
				// second 数据的实体所在的路径
				.packages("org.test.data.entity.second")
				// persistenceUnit 的名字采⽤ second
				.persistenceUnit("second").build();
	}

	/**
	 * 配置 second 数据源的事务管理者,命名为 secondTransactionManager 依赖
	 * secondEntityManagerFactory
	 *
	 * @param secondEntityManagerFactory
	 *            second 实体管理工厂
	 * @return second 事务管理者
	 */
	@Bean(name = "secondTransactionManager")
	// @Qualifier(value = "")
	public PlatformTransactionManager transactionManager(
			@Qualifier("secondEntityManagerFactory") EntityManagerFactory secondEntityManagerFactory) {
		return new JpaTransactionManager(secondEntityManagerFactory);
	}
}

配置文件部分(application.properties)

如需更为yml,可自行转换。
其中数据库连接池为观察效果用,可根据实际自行配置

#############################################
#######jpa setting
#############################################
#JPA Configuration:  
# Show or not log for each sql query
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect  
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

# 主数据源配置
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.primary.url=
spring.datasource.primary.username=
spring.datasource.primary.password=
# 主数据源连接池配置(主要为观察多数据源配置效果,可按实际配置或不配置)
# spring.datasource.hikari.primary.pool-name=jpa-hikari-pool-primary
# spring.datasource.hikari.primary.max-lifetime=900000
# spring.datasource.hikari.primary.maximum-pool-size=8

spring.datasource.second.driver-class-name=dm.jdbc.driver.DmDriver
spring.datasource.second.url=
spring.datasource.second.username=
spring.datasource.second.password=
# 第二数据源连接池配置(主要为观察多数据源配置效果,可按实际配置或不配置)
# spring.datasource.hikari.second.pool-name=jpa-hikari-pool-second
# spring.datasource.hikari.second.max-lifetime=500000
# spring.datasource.hikari.second.maximum-pool-size=6

Controller部分(测试)

此为测试效果用,不推荐直接在controller层调用dao层写法。

package org.test.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.test.data.entity.primary.Test;
import org.test.service.TestService;

@RestController
@RequestMapping("/test")
public class TestController {
	@Autowired
	private TestRepository testRepository;
	@Autowired
	private TestRepository2 testRepository2;
	
	@GetMapping
	public String test(String name) {
		testRepository.save(new Test(null, name));
		testRepository2.save(new Test2(null, name));
		return "ok";
	}
}

至此,便完成全部配置!

可能碰见的问题

1. 报语法不匹配/不支持问题“org.hibernate.HibernateException:对DialectResolutionInfo的访问在’hibernate.dialect’未设置时不能为空”

EntityManager工厂配置LocalContainerEntityManagerFactoryBean中添加方言指定:

hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.DmDialect");

详情可查看**配置部分(Configuration)**中TestSecondDataSourceConfig相关代码。

参考文章:使用多个数据源时,Spring boot Hibernate错误“当“Hibernate.dialent”未设置时,对方言解析信息的访问不能为null” - 一点教程

2. 报“仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值”问题

  1. 在版本8.1.1.49中,可通过将主键字段序列设置为@GeneratedValue(strategy = GenerationType.AUTO)解决
  2. 在版本8.1.2.192中,该问题已被解决。注意,新版本驱动更改了artifactId,详情如下:
    旧:
<dependency>
	<groupId>com.dameng</groupId>
	<artifactId>Dm8JdbcDriver18</artifactId>
	<version>8.1.1.49</version>
</dependency>

<dependency>
	<groupId>com.dameng</groupId>
	<artifactId>DmDialect-for-hibernate5.3</artifactId>
	<version>8.1.1.49</version>
</dependency>

新:

<dependency>
	<groupId>com.dameng</groupId>
	<artifactId>DmJdbcDriver18</artifactId>
	<version>8.1.2.192</version>
</dependency>

<dependency>
	<groupId>com.dameng</groupId>
	<artifactId>DmDialect-for-hibernate5.3</artifactId>
	<version>8.1.2.192</version>
</dependency>

3. 启动时报“org.hibernate.engine.jdbc.spi.TypeInfo : HHH000362: Unable to retrieve type info result set : dm.jdbc.driver.DMException: 第 1 行, 第 270 列[AUTO_INCREMENT]附近出现错误”问题

解决方法如问题2解决方法2即可。

参考文章

Spring Data JPA 之 多数据源配置_jpa 多数据源_曾小二的秃头之路的博客-CSDN博客
使用多个数据源时,Spring boot Hibernate错误“当“Hibernate.dialent”未设置时,对方言解析信息的访问不能为null” - 一点教程
spring boot mysql8 迁移到达梦报错[AUTO_INCREMENT]附近出现错误_wdd668的博客-CSDN博客
dm.jdbc.driver.DMException: 第 1 行, 第 270 列[AUTO_INCREMENT]附近出现错误:语法分析出错 | 达梦技术社区文章来源地址https://www.toymoban.com/news/detail-753065.html

到了这里,关于spring boot下基于spring data jpa配置mysql+达梦多数据源(以不同包路径方式,mysql为主数据源)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jpa与Druid线程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久层

                          Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二):几个坑 附录官网文档:core.domain-events域事件 docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五

    2024年02月13日
    浏览(54)
  • Spring Boot 篇四: Spring Data JPA使用SQL Server

    本篇介绍篇一至篇三中用到的JPA链接SQL Server的具体情况以及实战过程中可能遇到的问题。 具体的下载和安装教程,请参阅微软SQL Server官网; SQL Server Express 是免费的,并且配套的SQL Server Management Studio也是可以用的。 呃,当然,使用Docker来运行SQL Server是另外一条路径。具体

    2024年02月05日
    浏览(97)
  • Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

                         docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升维: 道、法、

    2024年02月13日
    浏览(60)
  • 【Spring Boot】SpringBoot和数据库交互: 使用Spring Data JPA

    在现代应用程序的开发中,数据是核心部分。为了能够持久化、检索、更新和删除数据,应用程序需要与数据库进行交互。 1.1 为什么需要数据库交互 数据持久化 :当你关闭应用程序或者服务器时,你仍希望数据能够保存。数据库提供了一个持久的存储方案,使得数据在关闭

    2024年02月12日
    浏览(52)
  • 如何使用Spring Data JPA简化MySQL数据访问

    本篇文章是 “一起学习mysql” 系列的第五篇文章,本篇文章我们学习一下Spring Data JPA的使用,在开始学习器,我们先来了解一下什么是JPA。 JPA的全称是Java Persistence API,是J2EE中的一条规范,它标准化了数据持久化API。在上一篇文章中,我们了解了如何使用MyBatis进行MySQL数据

    2024年02月15日
    浏览(70)
  • Spring Boot 配置双数据源

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.基本步骤 添加依赖 添加 Spring Boot 和数据库驱动的依赖 配置数据源 在 application.properties 或 application.yml 中分别配

    2024年01月22日
    浏览(65)
  • Spring Boot配置多个Kafka数据源

    application.properties配置文件如下 1.第一个kakfa 2.第二个kakfa 备注: 生产者消费者代码参考链接,开发同学需要以实际情况按要求自己变更下代码即可: Spring Boot 集成多个 Kafka_springboot集成多个kafka_//承续缘_纪录片的博客-CSDN博客

    2024年02月07日
    浏览(75)
  • 【Java】Spring Boot配置动态数据源

    1.1 创建动态数据源 通过实现Spring提供的AbstractRoutingDataSource类,可以实现自己的数据源选择逻辑,从而可以实现数据源的动态切换。 1.2 创建动态数据源配置类 跟配置静态多数据源一样,需要手动配置下面的三个 Bean,只不过DynamicDataSource类的targetDataSources是空的。 1.3 创建动

    2024年02月09日
    浏览(52)
  • 如何在Spring Boot中配置双数据源?

    在许多应用程序中, 可能会遇到需要连接多个数据库的情况 。这些数据库可以是不同的类型,例如关系型数据库和NoSQL数据库,或者它们可以是相同类型但包含不同的数据。为了处理这种情况,我们可以使用双数据源来管理多个数据库连接。 双数据源是指在一个应用程序中

    2024年02月11日
    浏览(50)
  • Spring Boot整合Mybatis配置多数据源

    在之前的事件管理系统博客中有提到动态的多数据源配置 工作中难免需要做几个工具方便自己偷懒,加上之前的挡板,数据源肯定没法单一配置,所以需要多数据源配置。这里介绍两种配置:动态数据源和固定数据源模式。这两种我在目前的工作的工具开发中都有用到。 M

    2024年01月23日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包