请问这个接口程序应该如何设计?

铁血男儿007 2020-09-08 05:35:23
使用Java语言开发一个接口程序,用来获取增量数据,请问这个接口应该如何设计,输入参数和输出参数分别是什么?

如何区分存量数据和增量数据,是通过主键ID,还是通过时间?

这个接口是对外的,外部客户调用该接口,不定期的把增量数据同步到我们的数据库中,要保证新插入的数据记录既不能多也不能少,既不能重复,也不能遗漏。

最好能给出示例代码,谢谢大家!
...全文
4577 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2020-09-10
  • 打赏
  • 举报
回复
新增修改有保存最新时间的话,可以传时间戳,但这个得客户端自己维护时间戳,这样才是最稳妥的,毕竟是否同步成功也就客户端清楚,而不是服务端,也保证了灵活度和容错空间
杀猪剑客 2020-09-10
  • 打赏
  • 举报
回复
我觉得挺简单的 啊,数据必须要有一个唯一字段,在表中设置这个字段为唯一索引,如果重复了就会报错!
小灰狼 2020-09-09
  • 打赏
  • 举报
回复
还有简单点的办法是,你们订个数据格式,然后你开个 ftp 服务器,对方把数据传到你的FTP服务器上来,然后你定期扫描有没有新文件
小灰狼 2020-09-09
  • 打赏
  • 举报
回复
如果楼主没表达错误,并且我也没理解错的话,情况应该是: 1、你开发一个接口,给客户调用 2、数据本来是在客户那里,他定期通过调用接口,把增量数据传到你的平台上来 3、你保存增量数据 这种需求,建议: 1、开放一个 http 接口,让对方用 http 协议,以 json 的方式把数据发给你,当然也要考虑身份认证之类的问题 2、数据要有主键,如果客户不肯给主键,那也至少要有一个或者几个字段能够唯一确定一条记录,也就是候选键,这样才能确定发过来的数据,你是要进行更新还是进行插入 3、你收到数据时,最好给客户平台的充足的响应信息,比如对方发了100条过来,每条记录处理结果,如插入、更新、失败,这样便于对方重发。如果这样处理不方便,那么至少这100条数据的整体处理结果要响应给对方。 4、要考虑意外情况,比如客户发数据给你时,正好你的服务器当机,或者路由器死机、机房停电之类的非可抗因素造成的数据接收不了。这时你应该要求对方要有失败重发机制。
qybao 2020-09-09
  • 打赏
  • 举报
回复
这个就要看你是想用什么方式来同步数据(主要是跟外部客户协调好) 我这边刚完成的一个on-premise到cloud的移植项目是以文件的方式(因为考虑到数据量可能很大)来同步增量数据的。也就是客户不定期的抽取增量数据(以时间戳为准,当然,如果你的主键ID是自动递增,用主键ID也可以)做成文件,上传到我这边的服务器,服务器监视到新文件就触发batch执行,把文件数据插入数据库。 新插入的数据记录既不能多也不能少,既不能重复,也不能遗漏,要保证这点,主要还是看你的实现方式了。我这边的做法是客户抽取数据的时间戳比上次抽取结束的时间戳稍往前一点(即抽出的数据做成的文件会有少量重复数据),batch的这边插入的时候过滤掉重复的数据。
s478853630 2020-09-09
  • 打赏
  • 举报
回复

/**
	 * 合并数据,insert和update,主键可以多个
	 * 
	 * @param dbset        数据库配置
	 * @param table        表名
	 * @param list         数据源
	 * @param targetMain   表的主键
	 * @param targetColumn 表的所有列(包含主键)
	 * @param sourceMain   数据源的主键
	 * @param sourceColumn 数据源中所有列(包含主键)
	 * @throws Exception 捕获异常
	 */
	public static void merge(DatabaseSet dbset, String table, List<Map<String, Object>> list, List<String> targetMain, List<String> targetColumn,
			List<String> sourceMain, List<String> sourceColumn) throws Exception {
		if (Database.saphana.equals(dbset.database())) {
			String sql = SqlUtil.insert(dbset, table, targetColumn).replaceAll("insert into", "upsert") + SqlUtil.joinMain(dbset, targetMain);
			sourceColumn.addAll(sourceMain);
			BatchUtil.manage(dbset.connect(), sql, list, sourceColumn);
			return;
		}
		List<String> sourceUpdateColumn = new ArrayList<String>();
		for (String s : sourceColumn) {
			if (!sourceMain.contains(s)) {
				sourceUpdateColumn.add(s);
			}
		}
		sourceUpdateColumn.addAll(sourceMain);
		String insert = SqlUtil.insert(dbset, table, targetColumn), update = SqlUtil.update(dbset, table, targetColumn, targetMain);
		List<Map<String, Object>> inserts = new ArrayList<Map<String, Object>>(),
				updates = split(dbset, list, inserts, table, targetMain, sourceMain);
		Object[] values = { inserts.size(), updates.size() };
		log.info(EntityUtil.toJson(EntityUtil.create(Map.class, new String[] { "insert", "update" }, values, false)));
		if (updates.size() > 0) {
			manage(dbset.connect(), update, updates, sourceUpdateColumn);
		}
		if (inserts.size() > 0) {
			manage(dbset.connect(), insert, inserts, sourceColumn);
		}
	}
rumlee 2020-09-09
  • 打赏
  • 举报
回复
这个得根据实际情况,如果数据只有插入操作,类似于日志那种的,用id就可以了。如果数据还存在修改、删除等操作,那建议加一个版本字段,每次获取的时候带上版本号,版本号每次都自动往上递增,当有修改或者删除(逻辑删除)的时候记录版本号。这样可以根据版本号进行查询。
s478853630 2020-09-09
  • 打赏
  • 举报
回复
既然是别人调用接口推送数据过来做增量,就定义一个String类型的参数,接收一个JSONArray格式的字符串,再把这个JSONArray格式的字符串转成List<Map<String, Object>>,这不就是增量数据么,再调用我那个方法把数据合并到数据库,就搞定了 全量也是一样,无非就是数据多一点,如果数据量特别大,就让对方多调几次接口 如果源数据删除也要同步,就再定义一个String类型的参数,接收一个JSONArray格式的字符串,再根据这个参数值做delete就行 出于安全考虑,接口最好做验签
whoisliang 2020-09-09
  • 打赏
  • 举报
回复
我感觉楼主最大的问题是如何定义增量,不是什么如何定义接口,什么数据库,什么json,什么http等。所以如何定义增量才是前提。这些要根据实际业务情况才能定义什么是增量数据。
KeepSayingNo 2020-09-09
  • 打赏
  • 举报
回复
这个肯定要通过ID来区分,时间的话不靠谱,可能某段时间传来的是几天前漏传的数据
冰思雨 2020-09-09
  • 打赏
  • 举报
回复
一般会建几张表来存放相关数据。 1. 接口请求表,每次调用接口都要进行记录,客户端的id,调用时间,传输的数据量(数据记录的条数),传输批次号(可以取自增主键的值,也可以自定义),传输的数据类型(用于不同类型的数据,服务端进行不同方式的处理,也就是多态)等等。 2. 接口数据表,存放每次接口传输的数据以及数据的处理状态,是做批量插入操作的,将1表中的批次号也带上,方便数据追踪,当每条数据处理完成后,更新数据状态。随着时间的推移,表长度会增加,后期考虑数据迁移,或者数据销毁。 接口设计思路。 1. 要确定一次请求是传输一条记录,还是一次请求传输多条记录(多条记录时要设置最大传输条数)。 2. 请求的数据中需要一个唯一标识一条记录的字段(也可以是多个字段组合形成的,业务逻辑上能够标明一条数据的ID值),用于区分是否是重复传输的数据。 3. 请求数据是否有认证的需求,防止外来其他目的的数据进行非法提交。一般是通过融入tocken来进行认证。 4. 请求数据是否有验证的需求,以防数据在传输过程中被别人拦截,更改后再传入服务器。一般是通过对数据和客户端ID之类的数据进行MD5(数字签名)后放入请求记录中,服务端采用相同算法进行验证。 5. 请求的数据是否有加密的需求,防止数据传输过程中,被第三方机构或者程序查看,造成数据泄露。 6. 上述接口的设计思路是采用推送的方式,由客户端不定时的推送的,所以,会要求客户端对推送的数据,采用失败重传的机制,方式数据丢失,服务端接收数据,要区分出哪些是重传的数据才行。 7. 推送方式的接收数据,会有一个服务端过载的问题,如果同时接收的数据过大,服务端有时候会处理不过来,造成客户端推送任务的超时等异常,所以,如果可能,服务端最好是有一个判断服务端负载状况的方案,当服务端过载时,不做数据处理,直接告诉客户端,稍后再试。 8. 应答数据内容,一般情况下会包含错误代码和文字解释。在接口协议的文档里面,会有一个附录,里面有错误代码表,说明,什么样的错误代码,表示什么场景下的错误。客户端可以根据错误代码,完善业务流程。 以上是楼主说的推送的方式进行数据传递。 其实,还可以拉取的方式,就是,服务器定时轮询各个数据源,如果它们有增量数据就顺便传输过来,如果没有,就应答一个没有的代码给你。
内容概要:本文介绍了一个基于Python的无人机三维路径规划项目,采用差分进化算法(DE)在复杂三维环境中自动生成安全、高效的飞行路径。项目构建了包含起点、终点和多个长方体障碍物的三维空间模型,通过将路径编码为中间航点向量,利用差分进化进行全局优化。适应度函数综合考量路径长度、碰撞惩罚、安全距离、转弯代价、爬升能耗和高度约束,确保生成的路径在安全性、平滑性和可行性之间取得平衡。优化后还引入路径简化机制,删除冗余航点并检测直连安全性,以减少航点数量并提升可执行性。程序输出包括三维路径图、障碍物可视化、适应度收敛曲线及各项性能指标,支持后续扩展至真实地图、地形模型和动力学仿真。; 适合人群:具备Python编程基础,熟悉NumPy、matplotlib等库,从事无人机、智能优化、路径规划相关研究或开发的科研人员、研究生及工程师(工作年限1-3年或有相关项目经验者); 使用场景及目标:①解决城市、山区、工业区等复杂三维环境下的无人机避障路径规划问题;②学习差分进化算法在连续空间优化中的应用;③为低空物流、应急救援、巡检监测等实际场景提供算法原型与二次开发基础; 阅读建议:建议结合提供的完整代码与可视化结果进行实践,重点关注环境建模、适应度函数设计、差分进化实现与路径后处理逻辑,可通过调整参数(如种群规模、权重系数)观察优化效果变化,深入理解多目标权衡与算法调参策略。
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”提供了一套完整的数学建模、算法实现与论文撰写的免费资源。该资源由“荔枝科研社”出品,依托一个涵盖智能优化算法、机器学习、深度学习、信号处理、通信技术、电力系统管理等多个前沿领域的综合性科研资源共享平台。文档以MATLAB和Python为主要工具,聚焦于复杂工程问题的建模与求解,尤其在干扰源定位、状态估计、路径规划及优化调度等方面具有突出的应用价值。资源不仅包含竞赛题目解析,还提供了大量可复现的代码实例与技术文档,旨在帮助用户深入理解算法原理并提升科研实践能力。; 适合人群:具备一定编程基础,特别是熟练掌握MATLAB或Python语言的本科生、研究生,正在备战数学建模竞赛的学生,以及从事通信、信号处理、电力系统等相关领域研究的科研人员和技术开发者。; 使用场景及目标:①为参赛学生提供B题的完整解题思路、模型构建方法与代码实现路径,加速竞赛准备进程;②为科研工作者提供高质量、可复现的算法代码与技术参考,推动智能算法在无线通信、应急响应、环境监测等实际场景中的应用研究;③促进跨学科技术融合,支持教学、科研与工程实践的协同发展。; 阅读建议:建议读者结合文中提供的网盘链接与《荔枝科研社资源整理目录》系统性地查阅资料,优先选择与自身研究方向契合的技术模块进行深入学习,并动手运行代码以验证算法效果。同时推荐关注微信公众号“荔枝科研社”以获取持续更新的技术内容与社群支持。

67,535

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧