ruoyi-vue整合tdengine多数据源

2023-11-02

实现方式一

使用若依文档中的多数据源配置

在application-druid.yml配置从库数据源

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: 账号
                password: 密码
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                # 默认不启用TDengine,true=启用,false=不启用
                enabled: true
#                driverClassName: com.taosdata.jdbc.TSDBDriver
#                url: jdbc:TAOS://tdengine-server:6030/数据库名?timezone=Asia/Beijing&charset=utf-8
#                username: 账号
#                password: 密码
                driverClassName: com.taosdata.jdbc.rs.RestfulDriver
                url: jdbc:TAOS-RS://tdengine-server:6041/数据库名?timezone=Asia/Beijing&charset=utf-8
                username: 账号
                password: 密码

            # 初始连接数
            initialSize: 5
            # 最小连接池数量
            minIdle: 10
            # 最大连接池数量
            maxActive: 20
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # 配置一个连接在池中最小生存的时间,单位是毫秒
            minEvictableIdleTimeMillis: 300000
            # 配置一个连接在池中最大生存的时间,单位是毫秒
            maxEvictableIdleTimeMillis: 900000
            # 配置检测连接是否有效
            validationQuery: SELECT 1 # SELECT 1 FROM DUAL 不使用全查询,如果使用tdengine多数据源报数据库不存在错误
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            webStatFilter:
                enabled: true
            statViewServlet:
                enabled: true
                # 设置白名单,不填则允许所有访问
                allow:
                url-pattern: /druid/*
                # 控制台管理用户名和密码
                login-username: ids
                login-password: 123456
            filter:
                stat:
                    enabled: true
                    # 慢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: false #设为false tdengine sql才能运行成功
                wall:
                    config:
                        multi-statement-allow: true

多数据源使用

在需要多数据源的方法或类上加入@DataSource注解

@Service
@DataSource(DataSourceType.SLAVE)
public class testServiceImpl implements testService
{
...
}

注意事项

1.在插入数据时需要设置useGeneratedKeys参数,否则会报数据库不存在错误。原因为ruoyi-vue在mybatis-config.xml文件全局开启了主键id自增,tdengine不支持id自增功能。

<insert id="insertData" useGeneratedKeys="false">
</insert>

2.注意多数据源文件配置中参数的变化,否则也会出现相应的报错或者sql执行不成功等情况
3.ruoyi-vue版本为3.8.5
4.tdengine使用restful方式连接无需安装客户端,若使用原生连接需要保证客户端与数据库版本的一致性

实现方式二

自定义数据源

在application-druid.yml配置从库数据源

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: 账号
        password: 密码
      # 从库数据源
      slave:
        # 从数据源开关/默认关闭
        enabled: false

      # TDengine数据库
      tdengine-server:
        # 默认不启用TDengine,true=启用,false=不启用
#        enabled: true
#        driverClassName: com.taosdata.jdbc.rs.RestfulDriver
#        url: jdbc:TAOS-RS://tdengine-server:6041/数据库名?timezone=Asia/Beijing&charset=utf-8
#        username: 账号
#        password: 密码
#        dbName: 数据库名 #非必要,自定义使用
        enabled: true
        driverClassName: com.taosdata.jdbc.TSDBDriver
        url: jdbc:TAOS://tdengine-server:6030/数据库名?timezone=Asia/Beijing&charset=utf-8
        username: 账号
        password: 密码
        dbName: 数据库名 #非必要,自定义使用

      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置连接超时时间
      connectTimeout: 30000
      # 配置网络超时时间
      socketTimeout: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # 慢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true

添加TDengineConfig配置文件

import com.alibaba.druid.pool.DruidDataSource;
import com.ruoyi.common.utils.StringUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Configuration
@MapperScan(basePackages = {"com.ruoyi.iot.tdengine.dao"}, sqlSessionTemplateRef = "tdengineSqlSessionTemplate")
@ConditionalOnProperty(name = "spring.datasource.druid.tdengine-server.enabled", havingValue = "true")
public class TDengineConfig {

    @Value("${spring.datasource.druid.tdengine-server.dbName}")
    private String dbName;
    @Value("${spring.datasource.druid.tdengine-server.url}")
    private String jdbc;


    @Bean(name = "tDengineDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.tdengine-server")
    public DataSource tdengineDataSource() {
        return new DruidDataSource();
    }



    @Bean(name = "tDengineSqlSessionFactory")
    public SqlSessionFactory tDengineSqlSessionFactory(@Qualifier("tDengineDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations(StringUtils.split("classpath:mapper/tdengine/*Mapper.xml", ",")));
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }


    @Bean(name = "tdengineSqlSessionTemplate")
    public SqlSessionTemplate tdengineSqlSessionTemplate(@Qualifier("tDengineSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    public String getDbName() {
        return dbName;
    }

    public void setDbName(String dbName) {
        this.dbName = dbName;
    }
    public Resource[] resolveMapperLocations(String[] mapperLocations)
    {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        List<Resource> resources = new ArrayList<Resource>();
        if (mapperLocations != null)
        {
            for (String mapperLocation : mapperLocations)
            {
                try
                {
                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
                    resources.addAll(Arrays.asList(mappers));
                }
                catch (IOException e)
                {
                    // ignore
                }
            }
        }
        return resources.toArray(new Resource[resources.size()]);
    }
}

修改MyBatisConfig文件

package com.ruoyi.framework.config;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import javax.sql.DataSource;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.ClassUtils;
import com.ruoyi.common.utils.StringUtils;

/**
 * Mybatis支持*匹配扫描包
 *
 * @author ruoyi
 */
@Configuration
public class MyBatisConfig
{
    @Autowired
    private Environment env;

    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";

    public static String setTypeAliasesPackage(String typeAliasesPackage)
    {
        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
        List<String> allResult = new ArrayList<String>();
        try
        {
            for (String aliasesPackage : typeAliasesPackage.split(","))
            {
                List<String> result = new ArrayList<String>();
                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
                Resource[] resources = resolver.getResources(aliasesPackage);
                if (resources != null && resources.length > 0)
                {
                    MetadataReader metadataReader = null;
                    for (Resource resource : resources)
                    {
                        if (resource.isReadable())
                        {
                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
                            try
                            {
                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
                            }
                            catch (ClassNotFoundException e)
                            {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                if (result.size() > 0)
                {
                    HashSet<String> hashResult = new HashSet<String>(result);
                    allResult.addAll(hashResult);
                }
            }
            if (allResult.size() > 0)
            {
                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
            }
            else
            {
                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return typeAliasesPackage;
    }

    public Resource[] resolveMapperLocations(String[] mapperLocations)
    {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        List<Resource> resources = new ArrayList<Resource>();
        if (mapperLocations != null)
        {
            for (String mapperLocation : mapperLocations)
            {
                try
                {
                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
                    resources.addAll(Arrays.asList(mappers));
                }
                catch (IOException e)
                {
                    // ignore
                }
            }
        }
        return resources.toArray(new Resource[resources.size()]);
    }

    @Bean(name = "mysqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
    {
        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
        String mapperLocations = env.getProperty("mybatis.mapperLocations");
        String configLocation = env.getProperty("mybatis.configLocation");
        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
        VFS.addImplClass(SpringBootVFS.class);

        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        return sessionFactory.getObject();
    }

    @Bean(name = "mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("dynamicDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mysqlSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSessionFactory") SqlSessionFactory sqlSessionFactory)  {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

注意事项

1.tdengine的mapper不要和ruoyi相关mapper放在同一个目录,也不要叫mapper会和mybatis扫描路径冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruoyi-vue整合tdengine多数据源 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 统计学习方法学习1.0

    决策树 决策树是一种分类和回归方法 优点 模型可读性 分类速度快 过程 特征选择 决策树的生成 决策树的剪枝 损失函数 正则化的极大似然函数 特征选择 多个特征时 如何选择某个特征作为判断的依据 信息增益 熵定义 熵越大 随机变量的不确定性
  • Java中calendar类常用方法介绍 (获取年月日星期)

    概述 Calendar 类是一个抽象类 它为特定瞬间与一组诸如 YEAR MONTH DAY OF MONTH HOUR 等日历字段之间的转换提供了一些方法 并为操作日历字段 例如获得下星期的日期 提供了一些方法 构造 父类引用指向子类对象
  • BDS - Chapter - 3 - Remedial Unix Shell

    This book assumes you re familiar with basic topics such as what a terminal is what the shell is the Unix filesystem hie
  • 自动化测试很容易学,是你的方法用错了

    目录 一 初识自动化测试 二 自动化测试和手工测试有什么不同 三 什么是自动化测试 四 自动化测试和手工测试应用范围的对比 五 区别对待不同的测试阶段 六 如何评估测试工具 七 如何选择合适的测试工具 八 如何学习自动化测试 一 初识自动化
  • 高德地图组件在Android的应用以及Android与JavaScript的交互(一)

    最近在慕课网学习了关于高德地图组件的课程 其实就是一个广告 内容和官网的API完全一样 发现这个JavaScript API比Android API简单方便多了 于是就打算放在Android APP上来实现 花了一点小功夫 但是最终还是实现
  • idea调试怎么跳出循环_你不知道的 IDEA Debug调试小技巧(小结)

    一 多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的 就像下面这张图 平时我们都使用的是默认的 ALL 在Eclipse中默认是线程模式 这种模式我们只能将一个线程断下来 但其他线程却已经执行过了 而将其
  • 校园网防PROXY代理原理与方法分析

    一 概述 本文针对园区网尤其是校园网存在的RPOXY代理问题 进行了详细的技术说明 并针对不同的应用情况提出了多种解决方案 其实 PROXY问题存在于两个方面 一是利用PROXY发表反动言论 二是利用PROXY逃避计费 利用PROXY发表反
  • FPGA按键防抖

    文章目录 basys3按键电路 按键消抖 软件消抖原理 软件消抖代码 仿真结果 basys3按键电路 按键消抖 按键消抖通常的按键所用开关为机械弹性开关 当机械触点断开 闭合时 由于机械触点的弹性作用 一个按键开关在闭合时不会马上稳定地接通
  • react+electron从环境搭建到项目整合全过程

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 Electron是什么 Electron 是一个由 GitHub 开发的开源库 通过将 Chromium 和Node js 组合并使用 HTML CSS 和 J
  • 安装PowerDesigner后,office2007中鼠标不能用

    由于PowerDesigner的com插件造成Office word 2007鼠标无法正常使用 只要删除此加载项目就ok Word 2007 删除其中PowerDesigner的com加载项 HKEY CURRENT USER Softwa
  • 冒泡排序(C++)完整代码

    算法学习 本人机械科研dog一枚 对算法感兴趣 这是我自学算法的记录 第一天 冒泡排序 文章目录 算法学习 一 冒泡排序原理 二 核心代码 三 算法复杂度分析 一 冒泡排序原理 1 从后往前依次比较相邻的元素 若是要按照升序排序 则后面的元
  • 中科院jcr分区2020_中科院SCI期刊分区(又称JCR期刊分区)知多少

    SCI期刊常用的评价指标是IF 考虑到IF指标是洋指标 中国科研工作者进一步根据国情设立了中科院JCR期刊分区表来对期刊的管理进行补充 中科院期刊分区其实就是把所有的期刊按照一定指标划分为四个层次 类似 优 良 及格 等 最开始 这个分区只
  • 以太网眼图测试整改案例分析

    故障现象 以太网眼图测试中 出现不通过现象 结果如下 由上可知 主要是眼图模板下方不能通过 更换不同的PHY芯片 结果依旧 故障分析 眼图测试 其测试内容为MAC芯片 经过变压器到网口之间的原理设计 PCB布局及走线 故障电路设计如下 PC
  • 机器学习之线性回归:OLS 无偏估计及相关性python分析

    戳上面的蓝字关注我们 作者 alg flody 编辑 Emily 0 回顾 在最近的推送中 先后总结了最小二乘法的原理 两个求解方法 直接法和梯度下降 最后利用这两种思路进行了python实战 在用直接法求出权重参数时 有一个假设是某个矩阵
  • 用BF写一个根据位置值实现指针自增的代码

    BF代码 根据位置值实现指针自增 BrainFuck 实现指针会根据目前位置存储的值来自增 比如 4 8 则指针会移动到 12 即 4 8 目前位置 n 的前3个位置 n 1 n 2 n 3 需要为0以便转移数据 代码 gt lt lt l
  • vue平滑滚动到指定位置

    需求 锚点导航问题 点击导航跳到对应的模块 两种方式 1 滚动盒子滚动到指定高度 scrollTo offsetTop每个模块顶部距离可滚动盒子的顶部偏移的像素值 goAnthor selector const height documen
  • windows中如何将已安装的nodejs高版本降级为低版本

    第一步 先清空本地安装的node js版本 1 按健win R弹出窗口 键盘输入cmd 然后敲回车 或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出 输入cmd再点击回车键 然后进入命令控制行窗口 并输入where node查看之前本地
  • 关于两重viewpager+fragment,再重回第二个viewpager消失问题

    问题 第一次进入第二个viewpager中时没有问题 当第二次次进入第二个viewpager中时 viewpager显示空白 解析 1 在第二个fragment中设置viewpager的适配器时 调用了 ViewPagerAdapter n
  • 大数据导论三——大数据技术

    大数据技术层面及其功能 数据采集和预处理 功能 利用ETL工具将分布的数据 抽取到临时中间层后进行处理 最后加载到数据仓库中 成为联机分析处理 数据挖掘的基础 利用日志采集工具把实时采集的数据作为流计算的输入 进行实时处理分析 利用网页爬虫
  • ruoyi-vue整合tdengine多数据源

    ruoyi vue整合tdengine多数据源 实现方式一 在application druid yml配置从库数据源 多数据源使用 注意事项 实现方式二 在application druid yml配置从库数据源 添加TDengineCo