首页 文章 精选 留言 我的

精选列表

搜索[数据传输],共4253篇文章
优秀的个人博客,低调大师

大话网络协议:拨开表象,探究网络数据传输的真实奥秘

在网络编程的世界里,协议栈是每一位开发者都无法绕开的基础设施。从浏览网页到视频通话,从即时消息到云端数据同步,所有这一切都依赖于一套精密的协议体系在默默运转。然而,绝大多数开发者对网络协议的认知,停留在“TCP是可靠的,UDP是不可靠的”这种粗颗粒度层面。一旦遇到连接超时、延迟飙升或数据丢失等实际问题,便束手无策。拨开这层表象,我们会发现网络协议的设计背后,处处体现着精妙的工程权衡——可靠性、效率、公平性、实现复杂度之间的反复博弈。

优秀的个人博客,低调大师

高效数据传输:Java通过绑定快速将数据导出至Excel

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 把数据导出至 Excel 是很常见的需求,而数据的持久化,往往又放在数据库中。因此把数据库中的数据导出到 Excel中,成了非常普遍的一个需求。 以关系型数据库为例,数据表是一个二维矩阵,但是为了易于操作和维护,在数据读取中,都会定义类,并且以对象的形式在内存中存放数据。但是Excel的工作表又是另一个二维矩阵,这就意味着,从数据库读取出的对象数据,又需要循环写入另一个表格中,这使得代码难以维护。 为了解决数据不易维护的问题,可以给工作表,单元格或者表格设置对象及单元格的绑定关系,这样在保存时便可以根据数据源的绑定关系,自动填充数据。 具体实现方法 现有数据类如下: public static class SalesRecord { public int sales; public String productType; public String product; public String salesman; public String area; } public static class SalesData { public ArrayList records; } 样本数据如下: private SalesData getDataSource() { // 创建数据源 SalesData datasource = new SalesData(); datasource.records = new ArrayList(); // 添加数据 SalesRecord record1 = new SalesRecord(); record1.area = "NorthChina"; record1.salesman = "Hellen"; record1.product = "Apple"; record1.productType = "Fruit"; record1.sales = 120; datasource.records.add(record1); SalesRecord record2 = new SalesRecord(); record2.area = "NorthChina"; record2.salesman = "Hellen"; record2.product = "Banana"; record2.productType = "Fruit"; record2.sales = 143; datasource.records.add(record2); SalesRecord record3 = new SalesRecord(); record3.area = "NorthChina"; record3.salesman = "Hellen"; record3.product = "Kiwi"; record3.productType = "Fruit"; record3.sales = 322; datasource.records.add(record3); return datasource; } 1.数据源绑定至工作表 下面是给工作表设置数据源绑定的代码,其中setAutoGenerateColumns设置为false,当setAutoGenerateColumns为true 时,工作表会根据数据源自动生成列。 public void SheetBinding() { // 创建一个新的workbook Workbook workbook = new Workbook(); // 获取默认sheet IWorksheet worksheet = workbook.getWorksheets().get(0); SalesData datasource = getDataSource(); // 自动生成列设置为false worksheet.setAutoGenerateColumns(false); // 给工作表中的每一列绑定数据源 worksheet.getRange("A:A").getEntireColumn().setBindingPath("area"); worksheet.getRange("B:B").getEntireColumn().setBindingPath("salesman"); worksheet.getRange("C:C").getEntireColumn().setBindingPath("product"); worksheet.getRange("D:D").getEntireColumn().setBindingPath("productType"); worksheet.getRange("E:E").getEntireColumn().setBindingPath("sales"); // 设置数据源 worksheet.setDataSource(datasource.records); // 保存为Excel文件 workbook.save("output/SheetBinding.xlsx"); } 实现效果如下: 2.数据源绑定至单元格 // 创建workbook Workbook workbook = new Workbook(); // 获取默认的sheet IWorksheet worksheet = workbook.getActiveSheet(); // 添加数据 SalesRecord record = new SalesRecord(); record.area = "北方"; record.salesman = "李强"; record.product = "苹果"; record.productType = "水果"; record.sales = 120; // 给单元格设置绑定 worksheet.getRange("A1").setBindingPath("area"); worksheet.getRange("B2").setBindingPath("salesman"); worksheet.getRange("C2").setBindingPath("product"); worksheet.getRange("D3").setBindingPath("productType"); // 设置数据源 worksheet.setDataSource(record); // 保存为Excel workbook.save("output/CellBinding.xlsx"); 实现效果如下: 3.数据源绑定至表格 下面的代码使用了setExpandBoundRows ,ITable.setExpandBoundRows方法用来处理一个绑定的表格对数据源的更改该如何响应。当属性设置为true时,该绑定表格会使用整行操作自动调整行数以适应数据源更改。 // 创建workbook Workbook workbook = new Workbook(); // 获取默认的sheet IWorksheet worksheet = workbook.getActiveSheet(); SalesData datasource = getDataSource(); // 添加一个表格 ITable table = worksheet.getTables().add(worksheet.getRange("B2:F5"), true); // 设置表格,不自动生成列 table.setAutoGenerateColumns(false); // 给表格设置绑定path table.setBindingPath("records"); // 设置setExpandBoundRows为true, table.setExpandBoundRows(true); // 设置表格列的数据字段 table.getColumns().get(0).setDataField("area"); table.getColumns().get(1).setDataField("salesman"); table.getColumns().get(2).setDataField("product"); table.getColumns().get(3).setDataField("productType"); table.getColumns().get(4).setDataField("sales"); // 设置数据源 worksheet.setDataSource(datasource); // 保存为excel workbook.save("output/TableBinding.xlsx"); 实现效果如下: 总结 通过给工作表、单元格或表格设置数据源绑定关系,可以实现将数据库中的数据导出到Excel的功能。这种方法使用对象和属性的绑定关系,将内存中的数据源与Excel中的工作表、单元格或表格进行连接。这样,在保存数据时,只需要根据数据源的绑定关系自动填充数据,而无需手动循环写入。这种实现方式简化了代码,提高了代码的可维护性和可扩展性。同时,通过设置自动生成列、设置绑定路径以及处理数据源变化等操作,还可以进一步增强导出功能的灵活性和适应性。总的来说,这种数据源绑定的方法为数据导出提供了一种优雅而高效的解决方案。 扩展链接: 从表单驱动到模型驱动,解读低代码开发平台的发展趋势 低代码开发平台是什么? 基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

优秀的个人博客,低调大师

Python socket 实现服务端和客户端数据传输(TCP)

服务器端 import socket #创建一个socket对象 socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "127.0.0.1" port = 9999 #绑定地址 socket_server.bind((host, port)) #设置监听 socket_server.listen(5) # socket_server.accept()返回一个元组, 元素1为客户端的socket对象, 元素2为客户端的地址(ip地址,端口号) client_socket, address = socket_server.accept() #while循环是为了让对话持续 while True: #接收客户端的请求 recvmsg = client_socket.recv(1024) #把接收到的数据进行解码 strData = recvmsg.decode("utf-8") #设置退出条件 if strData == 'q': break print("接收: %s" % strData) #输入 msg = input("发送: ") #发送数据,需要进行编码 client_socket.send(msg.encode("utf-8")) #关闭服务器端 socket_server.close() 客户端 import socket #创建一个socket对象 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "127.0.0.1" port = 9999 #连接服务端 client.connect((host, port)) while True: send_msg = input("发送: ") #设置退出条件 if send_msg == "q": break send_msg = send_msg #发送数据,编码 client.send(send_msg.encode("utf-8")) #接收服务端返回的数据 msg = client.recv(1024) #解码 print("接收:%s", % msg.decode("utf-8")) #关闭客户端 client.close() 流程图 图片来源:https://blog.csdn.net/slavik_/article/details/82430717参考链接:时光不写博客-Python socket

优秀的个人博客,低调大师

分析型数据库+数据传输,构建企业级实时数仓

什么是实时数仓 传统的离线数据仓库,将业务数据集中进行存储后,以固定的计算逻辑定时进行ETL 和其它建模后产出报表等应用。离线数据仓库一般采用每日或每几个小时进行一次计算的方式,计算和数据的实时性均较差,业务人员无法根据自己的即时性需要获取几分钟之前的实时数据。 而虽然软件技术和硬件的发展,实时数据仓库一类解决方案越发流行。实时数仓同时具有计算的实时性(计算在用户查询时发生,可自由变换,查询速度快),和数据的实时性(数据产生插入数仓后很短时间内既可以查询到),可以让业务人员在几秒钟甚至几百毫秒的时间内获取到包含最近几分钟内的数据计算结果,以最大的灵活度应对千变万化的业务挑战。 实时数据仓库解决方案还广泛的运用于物流行业的件量预测、O2O/电商行业的实时A-CRM系统、广告行业的M-DMP系统、国家政府机关如公安/交警的大数据系统,以及企

优秀的个人博客,低调大师

MySQL 数据传输参数设置对数据一致性的影响

作者通过全面系统的测试,揭秘 lower_case_table_names 设置对数据一致性的影响。 作者:刘安 爱可生测试团队成员,主要负责 DTLE 开源项目相关测试任务,擅长 Python 自动化测试开发。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 背景 最近有客户询问:源端 MySQL 和目标端 MySQL 的 lower_case_table_names 的配置不一致时,DTLE 是否能正常同步数据? 本文就这个问题测试一下 lower_case_table_names 的设置对 DTLE 同步数据的影响。 为了简化场景这里只讨论 Linux 环境下 lower_case_table_names 配置为 0 或 1 的情况。 环境准备 部署 DTLE 4.23.04.2 两个 MySQL 实例,lower_case_table_names 配置不同 # lower_case_table_names=0 $ dbdeployer deploy single 5.7 --port 3306 --sandbox-directory sandbox --port-as-server-id --remote-access % --bind-address 0.0.0.0 -c skip-name-resolve -c binlog_format=ROW -c binlog_row_image=FULL -c log_slave_updates=ON --gtid -c lower_case_table_names=0 # lower_case_table_names=1 $ dbdeployer deploy single 5.7 --port 3306 --sandbox-directory sandbox --port-as-server-id --remote-access % --bind-address 0.0.0.0 -c skip-name-resolve -c binlog_format=ROW -c binlog_row_image=FULL -c log_slave_updates=ON --gtid -c lower_case_table_names=1 第一种情况 源端 MySQL @@lctn=0 目标端 MySQL @@lctn=1 根据 DTLE 的开发文档 可知,此种情况下的 DTLE 行为: 源端按原大小写执行。 目标端收到 BinlogEntry - DML/DDL 按原大小写执行,MySQL 会自动转为小写。 以下是执行一些典型 SQL 的数据同步结果: 源端 SQL 与数据 目标段数据 CREATE DATABASE ACTION_DB; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ******<br>Database: ACTION_DB mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br>Database: dtle<br/> CREATE TABLE ACTION_DB.A(id int(11)) <br/>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: A mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a INSERT INTO ACTION_DB.A VALUES (1); <br><br>mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 ALTER TABLE ACTION_DB.A ADD D CHAR(20); <br><br>mysql> SHOW CREATE TABLE ACTION_DB.A\G <br>****** 1. row ****** <br>Table: A <br><br>Create Table: CREATE TABLE `A` ( <br>`id` int(11) DEFAULT NULL, <br>`D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 mysql> SHOW CREATE TABLE ACTION_DB.A\G <br>****** 1. row ****** <br>Table: A <br><br>Create Table: CREATE TABLE `a` (<br/>`id` int(11) DEFAULT NULL, <br/>`D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 ALTER TABLE ACTION_DB.A RENAME TO ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: B mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: b DROP TABLE ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>Empty set (0.00 sec) mysql> SHOW TABLES\G <br>Empty set (0.00 sec) 可以看到 DTLE 同步后的数据是符合预期。在源端 MySQL 与 SQL 的大小写一致,在目标端 MySQL 自动转为小写。 接下来看一些极端情况: 源端 SQL 和数据 目标端数据 CREATE DATABASE ACTION_DB; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: ACTION_DB mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br/>Database: dtle CREATE DATABASE action_db; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: ACTION_DB <br>****** 2. row ****** <br>Database: action_db mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br>Database: dtle CREATE TABLE ACTION_DB.A(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> use ACTION_DB <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: A mysql> use action_db <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br/>Tables_in_action_db: a CREATE TABLE ACTION_DB.a(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> use ACTION_DB <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_ACTION_DB: A <br>****** 2. row ****** <br>Tables_in_ACTION_DB: a mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a CREATE TABLE action_db.A(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br> mysql> USE action_db <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: A mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a CREATE TABLE action_db.a(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> USE action_db <br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: A <br>****** 2. row ****** <br>Tables_in_action_db: a mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a INSERT INTO ACTION_DB.A VALUES (1); <br><br>mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 INSERT INTO ACTION_DB.a VALUES (2); <br><br> mysql> SELECT * FROM ACTION_DB.a\G <br>****** 1. row ****** <br>id: 2 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 <br>****** 2. row ****** <br>id: 2 INSERT INTO action_db.A VALUES (3); <br><br>mysql> SELECT * FROM action_db.A\G <br>****** 1. row ****** <br>id: 3 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 <br>****** 2. row ****** <br>id: 2 <br>****** 3. row ****** <br>id: 3 INSERT INTO action_db.a VALUES (4); <br><br>mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 4 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 <br>****** 2. row ****** <br>id: 2 <br>****** 3. row ****** <br>id: 3 <br>****** 4. row ****** <br>id: 4 可以看到此时 DTLE 的行为,相当于把 ACTION_DB.A、ACTION_DB.a、action_db.A 和 action_db.a 四个表的数据合并到一张表。 所以为了避免此种情况,可以通过在创建 DTLE 作业的时候,为每个重名的库配置 TableSchemaRename 属性、重名表配置 Table.TableRename 属性的方式来解决。 第二种情况 源端 MySQL @@lctn=1 目标端MySQL @@lctn=0 根据 DTLE 的开发文档 里面介绍,此种情况下的 DTLE 行为: 用户填写的复制范围,应转化为小写。 不复制已有的大写 SCHEMA.TABLE。 新增的 Schema.Table,转化为小写后,加入复制范围。 目标端无论 @@lctn=0 或 @@lctn=1,都应该复制源端的效果,即小写。 目标端收到的 BinlogEntry 中,schema.tableName 已为小写。 以下是执行一些典型 SQL 的数据同步结果: 源端 SQL 和数据 目标端数据 CREATE DATABASE ACTION_DB; <br><br>mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db mysql> SHOW DATABASES\G <br>****** 1. row ****** <br>Database: action_db <br>****** 2. row ****** <br>Database: dtle CREATE TABLE ACTION_DB.A(id int(11)) <br>ENGINE=InnoDB DEFAULT CHARSET=utf8; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: a INSERT INTO ACTION_DB.A VALUES (1); <br><br>mysql> SELECT * FROM ACTION_DB.A\G <br>****** 1. row ****** <br>id: 1 mysql> SELECT * FROM action_db.a\G <br>****** 1. row ****** <br>id: 1 ALTER TABLE ACTION_DB.A ADD D CHAR(20); <br><br>mysql> SHOW CREATE TABLE ACTION_DB.A\G <br>****** 1. row ****** <br> Table: A <br><br>Create Table: CREATE TABLE `a` ( <br> `id` int(11) DEFAULT NULL, <br> `D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 mysql> SHOW CREATE TABLE action_db.a\G <br>****** 1. row ****** <br> Table: a <br><br>Create Table: CREATE TABLE `a` (<br> id int(11) DEFAULT NULL, <br> `D` char(20) DEFAULT NULL <br>) ENGINE=InnoDB DEFAULT CHARSET=utf8 ALTER TABLE ACTION_DB.A RENAME TO ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: b mysql> SHOW TABLES\G <br>****** 1. row ****** <br>Tables_in_action_db: b DROP TABLE ACTION_DB.B; <br><br>mysql> SHOW TABLES\G <br>Empty set (0.00 sec) mysql> SHOW TABLES\G <br>Empty set (0.00 sec) 可以看到 DTLE 同步后的数据是符合预期。在源端 MySQL 自动转为小写,在目标端 MySQL 同步的数据也是小写的。 其他限制 通过观察 general log 可以得知,DTLE 作业是在初始化作业的时候获取源端以及目标端 MySQL 的 lower_case_table_names 配置的,所以在 DTLE 作业存续期间更改 MySQL 的该参数是 DTLE 无法感知并处理的。因此禁止在 DTLE 作业存续期间更改此配置。 总结 原则上 DTLE 还是建议源端和目标端设置相同。 当源端 MySQL @@lctn=0 且目标端 MySQL @@lctn=1 时,需要注意源端仅大小写不同的同名库表在目标端会汇聚到同一个表中的问题。 DTLE 作业存续期间,MySQL 上的 lower_case_table_names 配置不可改变。 关于 SQLE 爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 SQLE 获取 类型 地址 版本库 https://github.com/actiontech/sqle 文档 https://actiontech.github.io/sqle-docs/ 发布信息 https://github.com/actiontech/sqle/releases 数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册