在shardingsphere执行存储过程

环境:

springboot:2.5.2

数据库:Kingbase金仓V8R6

依赖:

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.kingbase8</groupId>
            <artifactId>kingbase8</artifactId>
            <version>8.6.0</version>
        </dependency>

思路一:获取Connection执行存储过程

折腾了多种方式(EntityManager、DataSource、JdbcTemplate等),发现在shardingsphere环境下,始终不支持存储过程。

原因未知,没有深究出来。

可能是shardingsphere本身就不支持存储过程分片;

也就可能跟shardingsphere版本有问题;

还有可能是跟jdbc驱动包有关系(由于shardingsphere不适配金仓,jdbc驱动依然用的是org.postgresql.Driver);

... ...

shardingjdbc数据源配置

spring:
    shardingsphere:
        datasource:
            app100:
                driver-class-name: org.postgresql.Driver
                jdbc-url: jdbc:postgresql://IP:端口/数据库?serverTimezone=Asia/Shanghai&useSSL=false
                password: 
                type: com.zaxxer.hikari.HikariDataSource
                username: 
                connection-timeout: 30000
                minimum-idle: 10
                maximum-pool-size: 1000
                idle-timeout: 30000
                pool-name: hikari-100
                max-lifetime: 60000
                connection-test-query: SELECT 1
                leak-detection-threshold: 50000
            app101:
                driver-class-name: org.postgresql.Driver
                jdbc-url: jdbc:postgresql://IP:端口/数据库?serverTimezone=Asia/Shanghai&useSSL=false
                password: 
                type: com.zaxxer.hikari.HikariDataSource
                username: 
                connection-timeout: 30000
                minimum-idle: 10
                maximum-pool-size: 1000
                idle-timeout: 30000
                pool-name: hikari-101
                max-lifetime: 60000
                connection-test-query: SELECT 1
                leak-detection-threshold: 50000
            app102:
                driver-class-name: org.postgresql.Driver
                jdbc-url: jdbc:postgresql://IP:端口/数据库?serverTimezone=Asia/Shanghai&useSSL=false
                password: 
                type: com.zaxxer.hikari.HikariDataSource
                username: 
                connection-timeout: 30000
                minimum-idle: 10
                maximum-pool-size: 1000
                idle-timeout: 30000
                pool-name: hikari-102
                max-lifetime: 60000
                connection-test-query: SELECT 1
                leak-detection-threshold: 50000


换种思路:动态数据源

配置

spring:
    datasource:
        multiPrimary:
            pool-name: 100
            type: com.zaxxer.hikari.HikariDataSource
            connection-timeout: 30000
            minimum-idle: 50
            maximum-pool-size: 1000
            idle-timeout: 30000
            max-lifetime: 60000
            connection-test-query: SELECT 1
            username: 
            password: 
            jdbc-url: jdbc:kingbase8://IP:端口/数据库
            driver-class-name: com.kingbase8.Driver
        multiSecondarys:
            - secondary-101:
              pool-name: 101
              type: com.zaxxer.hikari.HikariDataSource
              connection-timeout: 30000
              minimum-idle: 50
              maximum-pool-size: 1000
              idle-timeout: 30000
              max-lifetime: 60000
              connection-test-query: SELECT 1
              username: 
              password: 
              jdbc-url: jdbc:kingbase8://IP:端口/数据库
              driver-class-name: com.kingbase8.Driver
            - secondary-102:
              pool-name: 102
              type: com.zaxxer.hikari.HikariDataSource
              connection-timeout: 30000
              minimum-idle: 50
              maximum-pool-size: 1000
              idle-timeout: 30000
              max-lifetime: 60000
              connection-test-query: SELECT 1
              username: 
              password: 
              jdbc-url: jdbc:kingbase8://IP:端口/数据库
              driver-class-name: com.kingbase8.Driver

相关配置类源码

public class MultDataSourceUtil {
    private static final ThreadLocal<String> DATASOURCE_KEY = new ThreadLocal<>();

    public static void setDataSourceRoutingKey(String key) {
        DATASOURCE_KEY.set(key);
    }

    public static String getDataSourceRoutingKey() {
        return DATASOURCE_KEY.get();
    }

    public static void clearDataSourceRoutingKey() {
        DATASOURCE_KEY.remove();
    }
}

import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@ConfigurationProperties("spring.datasource")
@Configuration
public class DataSourceConfig {
    private HikariDataSource multiPrimary;
    private Map<String, HikariDataSource> multiSecondarys = new HashMap<>();

    @Bean
    @Primary
    public DynamicDataSource falsDynamicDataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        multiSecondarys.forEach((key, secondary) -> {
            targetDataSources.put(secondary.getPoolName(), secondary);
        });
        targetDataSources.put(multiPrimary.getPoolName(), multiPrimary);
        DynamicDataSource dynamicDataSource = new DynamicDataSource(multiPrimary, targetDataSources);
        dynamicDataSource.afterPropertiesSet();
        return dynamicDataSource;
    }


    public HikariDataSource getMultiPrimary() {
        return multiPrimary;
    }


    public void setMultiPrimary(HikariDataSource multiPrimary) {
        this.multiPrimary = multiPrimary;
    }

    public Map<String, HikariDataSource> getMultiSecondarys() {
        return multiSecondarys;
    }

    public void setMultiSecondarys(Map<String, HikariDataSource> multiSecondarys) {
        this.multiSecondarys = multiSecondarys;
    }
}

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.Map;


public class DynamicDataSource extends AbstractRoutingDataSource {
    public DynamicDataSource() {
        super();
    }

    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
    }


    @Override
    protected Object determineCurrentLookupKey() {
        return MultDataSourceUtil.getDataSourceRoutingKey();
    }
}

业务类代码

import com.alibaba.fastjson.JSONObject;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Date;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;


@Slf4j
@Service
public class 业务ServiceImpl implements 业务Service {
    @Resource
    private DataSource dataSource;

    @PersistenceContext
    private EntityManager em;

    @Override
    public Map<String, String> zjjhpld(String paramStr) {

        Map<String, String> result = new HashMap<>();
        String msg = "";

        try {
            String orgId = "00320000000000000000";


            // region
            Query query = em.createNativeQuery(" SELECT 字段 FROM 表 where 字段=:orgId AND tenantId=:tenantId ");
            query.setParameter("orgId", orgId);
            query.setParameter("tenantId", tenantId);
            String treeinfoPath = (String) query.getSingleResult();
            System.out.println(treeinfoPath);
            // endregion



            Map<Object, DataSource> dataSourceMap = ((DynamicDataSource) dataSource).getResolvedDataSources();

            for (Map.Entry<Object, DataSource> entry : dataSourceMap.entrySet()) {
                String k = (String) entry.getKey();
                if ("100".equals(k)) {
                    continue;
                }
                DataSource v = entry.getValue();
                HikariDataSource hikariDataSource = (HikariDataSource) v;
                Connection conn = hikariDataSource.getConnection();

                CallableStatement callableStatement = conn.prepareCall("{ call 存储过程(?, ?) }");
                callableStatement.setString(1, orgId);
                callableStatement.registerOutParameter(2, Types.REF_CURSOR);

                callableStatement.execute();

                ResultSet resultSet = (ResultSet) callableStatement.getObject(2);

                while (resultSet.next()) {
                    System.out.println();
                }

                conn.close();
            }

        } catch (Exception e) {
            log.error("出现异常:", e);
        }
        return result;
    }
}

注意:

存储过程可以正常执行了,但是有个问题,第一个查询sql不走shardingjdbc的分库了。

发现获取的数据源已经变成了动态数据源,而不是shardingjdbc的数据源,这样不符合我们的需求。


再换个思路,去掉动态,只留下组装好的数据源

配置类代码:

import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@ConfigurationProperties("spring.datasource")
@Configuration
public class DataSourceConfig {
    private HikariDataSource multiPrimary;
    private Map<String, HikariDataSource> multiSecondarys = new HashMap<>();

    public HikariDataSource getMultiPrimary() {
        return multiPrimary;
    }


    public void setMultiPrimary(HikariDataSource multiPrimary) {
        this.multiPrimary = multiPrimary;
    }

    public Map<String, HikariDataSource> getMultiSecondarys() {
        return multiSecondarys;
    }

    public void setMultiSecondarys(Map<String, HikariDataSource> multiSecondarys) {
        this.multiSecondarys = multiSecondarys;
    }
}

业务代码:

import com.alibaba.fastjson.JSONObject;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Date;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;


@Slf4j
@Service
public class 业务ServiceImpl implements 业务Service {
    @Resource
    private DefaultListableBeanFactory beanFactory;
    @Resource
    private DataSourceConfig dataSourceConfig;

    @Resource
    private DataSource dataSource;

    @PersistenceContext
    private EntityManager em;

    @Override
    public Map<String, String> 业务(String paramStr) {

        Map<String, String> result = new HashMap<>();
        String msg = "";

        try {
            String orgId = "";
            String jhqj = "";


            HikariDataSource multiPrimary = dataSourceConfig.getMultiPrimary();
            Map<String, HikariDataSource> multiSecondarys = dataSourceConfig.getMultiSecondarys();


            /*HikariDataSource dataSource = new HikariDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db3?characterEncoding=utf8");
            dataSource.setUsername("root");
            dataSource.setPassword("123456");
            dataSource.getConnection();
            System.out.println("db3 创建完成!");
            beanFactory.registerSingleton("db3", dataSource);*/





            // region
            Query query = em.createNativeQuery(" SELECT 字段 FROM 表 where 条件=:orgId AND tenantId=:tenantId ");
            query.setParameter("orgId", orgId);
            query.setParameter("tenantId", tenantId);
            String val = (String) query.getSingleResult();
            // endregion


            for (Map.Entry<String, HikariDataSource> entry : multiSecondarys.entrySet()) {
                String k = entry.getKey();
                if ("100".equals(k)) {
                    continue;
                }
                DataSource v = entry.getValue();
                HikariDataSource hikariDataSource = (HikariDataSource) v;
                Connection conn = hikariDataSource.getConnection();

                CallableStatement callableStatement = conn.prepareCall("{ call 存储过程(?, ?) }");
                callableStatement.setString(1, orgId);
                callableStatement.registerOutParameter(2, Types.REF_CURSOR);

                callableStatement.execute();

                ResultSet resultSet = (ResultSet) callableStatement.getObject(2);

                while (resultSet.next()) {
                    System.out.println();
                }

                conn.close();
            }
        } catch (Exception e) {
            log.error("出现异常:", e);
        }

        return result;
    }
}

结果:

第一个查询依然走shardingjdbc,而且存储过程也可以正常执行,满足需求。


其他分享

动态数据源:集成JPA + MP,具体参考本人的另一篇博客《动态数据源》尚待整理

JPA配置类

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.SharedEntityManagerCreator;
import org.springframework.transaction.PlatformTransactionManager;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import java.util.Map;


@Configuration
@EnableConfigurationProperties(JpaProperties.class)
@EntityScan("com.**.entity")
@EnableJpaRepositories("com.**.repository")
public class JpaExtConfiguration {
    @Resource
    private JpaProperties jpaProperties;

    @Resource
    private DynamicDataSource dynamicDataSource;

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        Map<String, String> properties = jpaProperties.getProperties();
        properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");

        return builder.dataSource(dynamicDataSource).properties(properties).packages("com.**.entity").build();
    }

    @Primary
    @Bean
    public EntityManagerFactory entityManagerFactory(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
        return entityManagerFactoryBean.getObject();
    }

    @Primary
    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    @Primary
    @Bean
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
        return SharedEntityManagerCreator.createSharedEntityManager(entityManagerFactory);
    }
}

MP配置类

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;


@MapperScan(sqlSessionFactoryRef = "dynamicDataSourceSqlSessionFactory")
@Configuration
@Slf4j
public class MpExtConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "mybatis-plus.global-config")
    public GlobalConfig globalConfig() {
        return new GlobalConfig();
    }

    @Bean
    @ConfigurationProperties(prefix = "mybatis-plus.configuration")
    public MybatisConfiguration mybatisConfiguration() {
        return new MybatisConfiguration();
    }

    @Bean
    public SqlSessionFactory dynamicDataSourceSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource, GlobalConfig globalConfig, MybatisConfiguration mybatisConfiguration) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dynamicDataSource);
        sqlSessionFactoryBean.setGlobalConfig(globalConfig);
        sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
        return (SqlSessionFactory) sqlSessionFactoryBean.getObject();
    }
}

MP配置

mybatis-plus:
  global-config:
    enable-sql-runner: true
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925587.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速&#xff0c;汽车保有量也不断增长&#xff0c;导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求&#xff0c;通常会部署监控设备进行车位监测、现场安全监测等&#xff0c;助力构建智能化停车管理。因此如何为分…

直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例

在嵌入式开发中&#xff0c;位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算&#xff0c;并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…

多点DMALL启动招股:将在港交所上市,聚焦数字零售服务

近日&#xff0c;多点数智有限公司&#xff08;Dmall Inc.&#xff0c;下称“多点”或“多点DMALL”&#xff09;发布全球发售文件&#xff0c;于11月28日至12月3日招股&#xff0c;预计将于2024年12月6日在港交所主板挂牌上市。 招股书显示&#xff0c;多点DMALL本次全球发售的…

WRF-Chem模式安装、环境配置、原理、调试、运行方法;数据准备及相关参数设置方法

大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的&#xff0c;也是区域的&#xff0c;甚至是全球的。本地的污染物排放除了对当地造成严重影响外&#xff0c;同时还会在…

离线安装 Docker-IO:详细步骤指南

离线安装 Docker-IO:详细步骤指南 一、准备工作1.1 下载 Docker 离线安装包1.2 准备安装环境1.3 配置防火墙和 SELinux(可选)二、上传和解压离线安装包2.1 上传安装包2.2 解压安装包三、安装 Docker-IO3.1 移动 Docker 文件到系统目录3.2 配置 Docker 服务3.3 赋予服务文件执…

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者&#xff1a;陈承 背景 在 2018 年的 2 月&#xff0c;ARMS Java Agent 的第一个版本正式发布&#xff0c;为用户提供无侵入的的可观测数据采集服务。6 年后的今天&#xff0c;随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长&#xff0c;我们逐渐发现过…

【信息系统项目管理师】第3章:信息系统治理 考点梳理

文章目录 3.1 IT 治理3.1.1 IT治理基础3.1.2 IT治理体系3.1.3 IT治理任务3.1.4 IT治理方法与标准 3.2 IT 审计3.2.1 IT审计基础3.2.2 审计方法与技术3.2.3 审计流程3.2.4 审计内容 3.1 IT 治理 IT治理起到重要的统筹、评估、指导和监督作用。 信息技术审计(IT审计)作为与IT治…

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示&#xff1a;ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式&#xff0c;当GitHub上发生特定事…

全桥LLC变换器原理及MATLAB仿真模型

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主电路拓扑 全桥LLC 谐振变换器主电路拓扑结构图。图中S1 &#xff5e; S4为功率开关管&#xff0c; D1 &#xff5e; D4为功率开关管的体二极管&#xff0c; C1 &#xff5e; C4 为功率开关管的寄生电容。谐振电感r…

使用R语言进行美国失业率时空分析(包括绘图)

今天写一篇利用R语言&#xff0c;针对面板数据的简单分析与绘图。让我们直接开始把。 一、数据准备 这次的示例数据非常简单&#xff0c;只有一个shp格式的美国区县矢量数据&#xff0c;我们在QGIS中打开数据查看一下它的属性表。事实上我们需要的数据都在属性表的字段中。 二…

PostgreSQL在Linux环境下的常用命令总结

标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称&#xff1a;修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知&#xff1a; 以下所有命令我都在Linux环境中执行验证过&#xff0c;大家放心食用&#xff0c;其中的实际名称换成自己的实际名称即…

React Native学习笔记(三)

一 组件简介 1.1 简介 RN中的核心组件&#xff0c;是对原生组件的封装 原生组件&#xff1a;Android或ios内的组件核心组件&#xff1a;RN中常用的&#xff0c;来自react-native的组件 原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图&#xff1b;在 iOS 开发…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现&#xff0c;肤色聚类区域在Cb—Cr子平面上的投影将缩减&#xff0c;与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…

SQL Server管理员sa登录失败原因

文章目录 一、开启混合登录模式二、启用sa三、更改密码四、登录sa一、开启混合登录模式 用Windows身份登录数据库服务。 在连接名上右键→属性。 在安全性选项卡下,选择【SQL Server和Windows身份验证模式】,点击【确定】,提示需要重启服务。 Win+R,输入指令:services.ms…

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前&#xff0c;我们都在讲什么低代码/无代码平台&#xff0c;这个概念很久了&#xff0c;但是&#xff0c;一直没有很好的落地&#xff0c;整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来&#xff0c;各大科技公司也都推出了很多 AI 代码助手&#xff…

探秘多源异构数据:开启数据融合新时代

多源异构数据&#xff0c;其 “多源” 体现了数据来源的广泛多样性。在当今数字化时代&#xff0c;数据可能来自于不同的系统&#xff0c;比如企业内部可能同时使用多种管理系统&#xff0c;如 ERP&#xff08;企业资源计划&#xff09;系统、CRM&#xff08;客户关系管理&…

R语言结构方程模型(SEM)在生态学领域中的应用

目录 专题一、R/Rstudio简介及入门 专题二、结构方程模型&#xff08;SEM&#xff09;介绍 专题三&#xff1a;R语言SEM分析入门&#xff1a;lavaan VS piecewiseSEM 专题四&#xff1a;SEM全局估计&#xff08;lavaan&#xff09;在生态学领域高阶应用 专题五&#xff1…

springboot中使用mongodb完成评论功能

pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…