精华内容
下载资源
问答
  • 如何解决重复提交造成的数据重复

    千次阅读 2018-03-30 10:57:06
    其实,如果要追根溯源,幂等性是数学中的一个概念,表达的是N次变换1次变换的结果相同,有兴趣的读者可以从Wikipedia上进一步了解。 参考 RFC 2616, Hypertext Transfer Protocol – HTTP/1.1, Method ...

    理解HTTP幂等性
    基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议。HTTP协议是一种分布式的面向资源的网络应用层协议,无论是服务器端提供Web服务,还是客户端消费Web服务都非常简单。再加上浏览器、Javascript、AJAX、JSON以及HTML5等技术和工具的发展,互联网应用架构设计表现出了从传统的PHP、JSP、ASP.NET等服务器端动态网页向Web API + RIA(富互联网应用)过渡的趋势。Web API专注于提供业务服务,RIA专注于用户界面和交互设计,从此两个领域的分工更加明晰。在这种趋势下,Web API设计将成为服务器端程序员的必修课。然而,正如简单的Java语言并不意味着高质量的Java程序,简单的HTTP协议也不意味着高质量的Web API。要想设计出高质量的Web API,还需要深入理解分布式系统及HTTP协议的特性。

    幂等性定义
    本文所要探讨的正是HTTP协议涉及到的一种重要性质:幂等性(Idempotence)。在HTTP/1.1规范中幂等性的定义是:

    Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
    从定义上看,HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它,这可能是它不太受到重视的原因之一。但实际上,幂等性是分布式系统设计中十分重要的概念,而HTTP的分布式本质也决定了它在HTTP中具有重要地位。

    分布式事务 vs 幂等设计
    为什么需要幂等性呢?我们先从一个例子说起,假设有一个从账户取钱的远程API(可以是HTTP的,也可以不是),我们暂时用类函数的方式记为:

    bool withdraw(account_id, amount)
    withdraw的语义是从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。值得注意的是:和本地环境相比,我们不能轻易假设分布式环境的可靠性。一种典型的情况是withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。如图1所示:

    non-idempotent

    图1这里写图片描述

    这个问题的解决方案一是采用分布式事务,通过引入支持分布式事务的中间件来保证withdraw功能的事务性。分布式事务的优点是对于调用者很简单,复杂性都交给了中间件来管理。缺点则是一方面架构太重量级,容易被绑在特定的中间件上,不利于异构系统的集成;另一方面分布式事务虽然能保证事务的ACID性质,而但却无法提供性能和可用性的保证。

    另一种更轻量级的解决方案是幂等设计。我们可以通过一些技巧把withdraw变成幂等的,比如:

    int create_ticket()
    bool idempotent_withdraw(ticket_id, account_id, amount)
    create_ticket的语义是获取一个服务器端生成的唯一的处理号ticket_id,它将用于标识后续的操作。idempotent_withdraw和withdraw的区别在于关联了一个ticket_id,一个ticket_id表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果。这样,idempotent_withdraw就符合幂等性了,客户端就可以放心地多次调用。

    基于幂等性的解决方案中一个完整的取钱流程被分解成了两个步骤:1.调用create_ticket()获取ticket_id;2.调用idempotent_withdraw(ticket_id, account_id, amount)。虽然create_ticket不是幂等的,但在这种设计下,它对系统状态的影响可以忽略,加上idempotent_withdraw是幂等的,所以任何一步由于网络等原因失败或超时,客户端都可以重试,直到获得结果。如图2所示:

    idempotent

    图2
    这里写图片描述
    和分布式事务相比,幂等设计的优势在于它的轻量级,容易适应异构环境,以及性能和可用性方面。在某些性能要求比较高的应用,幂等设计往往是唯一的选择。

    HTTP的幂等性
    HTTP协议本身是一种面向资源的应用层协议,但对HTTP协议的使用实际上存在着两种不同的方式:一种是RESTful的,它把HTTP当成应用层协议,比较忠实地遵守了HTTP协议的各种规定;另一种是SOA的,它并没有完全把HTTP当成应用层协议,而是把HTTP协议作为了传输层协议,然后在HTTP之上建立了自己的应用层协议。本文所讨论的HTTP幂等性主要针对RESTful风格的,不过正如上一节所看到的那样,幂等性并不属于特定的协议,它是分布式系统的一种特性;所以,不论是SOA还是RESTful的Web API设计都应该考虑幂等性。下面将介绍HTTP GET、DELETE、PUT、POST四种主要方法的语义和幂等性。

    HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。

    HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。

    比较容易混淆的是HTTP POST和PUT。POST和PUT的区别容易被简单地误认为“POST表示创建资源,PUT表示更新资源”;而实际上,二者均可用于创建资源,更为本质的差别是在幂等性方面。在HTTP规范中对POST和PUT是这样定义的:

    The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line …… If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.

    The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
    POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。而PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。

    在介绍了几种操作的语义和幂等性之后,我们来看看如何通过Web API的形式实现前面所提到的取款功能。很简单,用POST /tickets来实现create_ticket;用PUT /accounts/account_id/ticket_id&amount=xxx来实现idempotent_withdraw。值得注意的是严格来讲amount参数不应该作为URI的一部分,真正的URI应该是/accounts/account_id/ticket_id,而amount应该放在请求的body中。这种模式可以应用于很多场合,比如:论坛网站中防止意外的重复发帖。

    总结
    上面简单介绍了幂等性的概念,用幂等设计取代分布式事务的方法,以及HTTP主要方法的语义和幂等性特征。其实,如果要追根溯源,幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同,有兴趣的读者可以从Wikipedia上进一步了解。

    参考
    RFC 2616, Hypertext Transfer Protocol – HTTP/1.1, Method Definitions
    The Importance of Idempotence
    Stackoverflow - PUT vs POST in REST

    展开全文
  • Java流的重复读取

    2021-04-03 11:26:37
    Java中普遍应用流来外部... 而Java中流处理中有个小型知识点在于流是不能重复读取的。伪代码如下 File file = new File( fileName); FileInputStream fi = new FileInputStream(file); HSSFWorkbook book =...

        Java中普遍应用流来与外部交换数据。比较典型的操作是操作文件与HttpServletRequest/Response流。

        而Java中流处理中有个小型知识点在于流是不能重复读取的。伪代码如下

                File file = new File( fileName);
                FileInputStream fi = new FileInputStream(file);            
                HSSFWorkbook book = new HSSFWorkbook(fi);
                int index = book.getNumberOfSheets();
                for (int i = 0; i < index; i++) {
                     List<Map<Integer, String>> resultList = 
                         ExcelUtil.readExcel(ExcelUtilEnum.EXCEL2003, book, i,0);
                 }

        上面代码块中,代码可以正常运行

                File file = new File( fileName);
                FileInputStream fi = new FileInputStream(file);            
                HSSFWorkbook book = new HSSFWorkbook(fi);
                int index = book.getNumberOfSheets();
                for (int i = 0; i < index; i++) {
                    List<Map<Integer, String>> resultList =     
                            ExcelUtil.readExcel(ExcelUtilEnum.EXCEL2003, fi, i);
                 }

        而在第二个代码块中,运行代码会抛出异常,两者的区别在于代码块2中,重复读取了流。

     

       这个点在于Java对于流的读取是通过指针性质的方式读取,这种方式只能向单边运行,并且不能从头再读取一次。

    展开全文
  • DupeString重复字串 StringOfChar的区别   StringOfChar 是反复 "字符" 成 "字符串" 的函数;DupeString 是反复 "字符串" 成 "新字符串" 的函数;StringOfChar ...

    DupeString重复字串 与StringOfChar的区别


     

    StringOfChar 是反复 "字符" 成 "字符串" 的函数;

    DupeString 是反复 "字符串" 成 "新字符串" 的函数;

    StringOfChar 来自 System 单元, 可以直接使用;

    DupeString 来自 StrUtils 单元, 使用时需要 uses StrUtils;

    如果仅仅是反复 "字符", 当然应该用 StringOfChar , 它是用汇编代码实现的, 速度会稍好一些.

    var
      p: PChar;
    begin
      p := PChar(StringOfChar(#0, 9));

    展开全文
  • 6.Junit测试类main方法的区别  Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何完成功能和完成什么样的功能。main就是java中的主方法测试。如果你的类里有多个方法,用main方法测试的...

     

    1.什么DAO?

        Data Access Object(数据存取对象)

        位于业务逻辑和持久化数据之间

        实现对持久化数据的访问  

    2. DAO的作用:

        1DAO起着转化器的作用,把实体类转化为数据中记录库。

        2、隔离业务逻辑代码和数据访问代码

        3、隔离不同数据的实现

    3. DAO模式的组成部分

            DAO接口    DAO实现   实体   数据库连接和关闭工具类

     

    4.持久化的主要操作

           读取    查找   保存  修改  删除

     

    5. 持久化:是将程序中的数据在瞬时状态和持久状态间转换的机制

    6. 持久化的实现方

         数据库    普通文件   XML文件 

     

     2.在运用当中,一般提供的是class文件,但是有些信息是要变化的,比如说ip地址,数据库名称等等,那么我们需要定义一个后缀名为properties的文件,通过ResourceBundle 来取出文件里面的内容。

        jdbc.properties文件

    driverClass = com.mysql.jdbc.Driver
    url = jdbc:mysql://127.0.0.1:3306/epet
    user = root
    password = root
    

         

    ResourceBundle rb = ResourceBundle.getBundle("jdbc");
            driverClass = rb.getString("driverClass");
            url = rb.getString("url");
            user = rb.getString("user");
            password = rb.getString("password");

    3.定义一个工具类

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.ResourceBundle;
    
    public class DBUtils {
    
    	private static String driverClass;
    	private static String url;
    	private static String user;
    	private static String password;
    	static {
    		ResourceBundle rb = ResourceBundle.getBundle("jdbc");
    		driverClass = rb.getString("driverClass");
    		url = rb.getString("url");
    		user = rb.getString("user");
    		password = rb.getString("password");
    
    		try {
    			Class.forName(driverClass);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static Connection getConnection() throws Exception {
    		return DriverManager.getConnection(url, user, password);
    	}
    
    	public static void closeAll(ResultSet resultSet, Statement statement,
    			Connection connection) {
    		if (null != resultSet) {
    			try {
    				resultSet.close();
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			if (null != statement) {
    				try {
    					statement.close();
    				} catch (Exception e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    			if (null != connection) {
    				try {
    					connection.close();
    				} catch (Exception e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    }
    

     4.在建立连接的时候直接调用我们在工具类当中定义的方法,最后关闭的时候遵循先创建的后关闭,后创建的先关闭的原则

     

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import com.beiwo.epe.dao.BaseDao;
    import com.beiwo.epe.util.DBUtils;
    
    public class BaseDaoImpl{
    
    	@Override
    	public int executeUpDate(String sql, Object[] param) {
    		// TODO Auto-generated method stub
    		Connection connection = null;
    		PreparedStatement preparedStatement = null;
    		ResultSet resultSet = null;
    		int num = 0;
    		try {
    			connection = DBUtils.getConnection();
    			preparedStatement = connection.prepareStatement(sql);
    			
    			if (null!=param) {
    				for (int i = 0; i < param.length; i++) {
    					preparedStatement.setObject(i+1, param[i]);
    				}
    			}
    			num = preparedStatement.executeUpdate();
    		} catch (Exception e) {
    			// TODO: handle exception
    		}finally {
    			DBUtils.closeAll(resultSet, preparedStatement, connection);
    		}
    		return num;
    	}
    
    }
    

     5.定义一个测试类,就可以不用main方法。

    6.Junit测试类与main方法的区别

      Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何完成功能和完成什么样的功能。main就是java中的主方法测试。如果你的类里有多个方法,用main方法测试的话就很不方便,想测试全部方法的话就得把测试代码全部写到main里,或者你测一个重写一次。且更重要的是,这样会使测试代码与运行逻辑代码混在一起,不规范。使用junit就方便多了,这是单元测试,你想测哪个方法就写一个对应的测试方法,然后用junit运行。每个方法之间是独立的,非常灵活。而且测试方法一般不会直接写在原类中,而是单独的测试类,这样测试代码就完全与逻辑代码分开了。

     

     

     

    转载于:https://www.cnblogs.com/houjiie/p/6178264.html

    展开全文
  • java 注解和 重复注解

    千次阅读 2015-03-02 15:28:14
    注解是java的一个新的类型(接口很相似),它类、接口、枚举是在同一个层次,它们都称作为java的一个类型(TYPE)。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释...
  • 使用el-cascader当数据量过大时,推荐使用异步加载机制,异步加载的好处也不用多说,当异步加载时,可能相同操作会重复从后台读取资源,占用资源不说,也对不起异步的初衷,其实很简单,判断绑定options是否加载过...
  • Android中重复执行动画bug

    千次阅读 2017-08-15 16:07:42
    在android中我们要经常用到看似一个没有时间限制的重复动画,如最常见的下拉刷新和上拉加载更多的loading加载动画: 今天尝试了三种动画(以旋转为例): package com.example.anim.anim;import android.animation....
  • js定时器(执行一次、重复执行)

    千次阅读 2020-05-06 04:50:58
    这篇文章主要分享一段js代码,有关js定时器的小例子,分为执行一次的定时器与重复执行的定时器,需要的朋友可以参考下 1,只执行一次的定时器 复制代码代码如下: 2,重复执行的定时器 复制代码代码如下: 备注: ...
  • 两者脚本的区别主要是销毁对象的引用不同。 (1)创建脚本写入如下代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjObj01Destory : MonoBehaviour { //...
  • 切换Fragment避免重复加载

    千次阅读 2016-05-03 19:46:51
    从网上搜索发现可以通过show和hide方法避免重复加载(借鉴了郭霖大神的思路,但是他的方式在我的app里会出现重影)。So我换了一种实现方式。当然本质没有区别,还是通过一次将所有的Fragment添加到一个集合里,再通过...
  • 变速跑、间歇跑、重复跑,训练的特点与区别 文章来源:跑吧会员佳宇  一、变速跑训练  源于1936年。在澳洲芬兰盛行。芬兰长跑明星维纶采用这种训练方法。奥运会上一举夺得三梅奥运金牌。(5000米,10000米。...
  • 接口重复调用的容错处理

    万次阅读 2016-07-29 11:07:30
    假如第一次是有效的提交,第二次是无效的订单,如何区别出这两次的提交是同一个订单。 (2)数据库表的需求: 1)每天每个账号只有一条记录,上面的seq改为seqs,空格隔开多个序号 2)数据库设计的表如下: 3)seqs...
  •  理论上层次名称和备注都是可以随意修改的,但是如果我只是修改备注,对名称不做任何的改动(或者是只是点开修改的弹出框,不做任何改动),点击确定进行提交,总是弹出层次名称重复的提示,导致修改失败。...
  • 最近执行一个python文件时发现,代码实际按照正常逻辑运行,但是多个代码段会重复执行多次,经查找相关资料,确定大致问题import导入模块有关(但奇怪的是import某些模块会导致重复执行,有的则正常,后续待研究)...
  • 这样,重复执行这个操作时,由于第一次更新数据的时候已经变更了前置条件中需要判断的数据,不满足前置条件,则不会重复执行更新数据操作 比如,将账户X的余额增加100元这个操作并不满足幂等性,可以把这个操作...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    1、varchar char 的区别,char 是一种固定长度的类型,varchar 则是一种可变长度的类型。 2、varchar(50) 中 50 的涵义最多存放 50 个字符。varchar(50) 和 (200) 存储 hello 所占空间一样, 但后者在排序时会...
  • 决策树随机森林初探

    万次阅读 2018-08-19 13:11:04
    决策树的优势力劣势 1、特征选择的几种方式 决策树的最关键的问题,如何选择划分属性的顺序才能使得决策树的平均性能最好 举例: 这堆西瓜的熵是Ent(D),按照某种属性划分之后这堆西瓜的熵是Ent(D′),...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    前端面试题汇总 ... 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?...它和Standards模式有什么区别 21 div+css的布局较table布局有什么优点? 22 img的alttitle有何异同? strongem的异同? 22 你能...
  • stata安装

    千次阅读 2019-07-30 22:47:57
    首先奉上简介 来源百度...它提供许许多多功能,包含线性混合模型、均衡重复反复及多项式普罗比模式。用Stata绘制的统计图形相当精美。说白了功能很强大,要不是最近处理一些数据用到了后缀是.dta的数据文件,我是真...
  • 其实今天遇到的最大问题还是mysql order by limit 排序分页数据重复的问题,昨天晚上搞了3个小时都没处理,因为不管怎么查数据也总会重复,查询了好多,都反映说在 order by上加一个主键UUID唯一的排序,然后再分页...
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    缺点 视图就是临时表,即调即用,如果数据源没有任何变化,在反复调用中,临时表会缓存到内存中(SHOW STATUS LIKE ‘Qcache%’;),视图中不能创建索引,但视图可以基于索引生成 。 C.场景 重用SQL语句; 简化复杂...
  • 浅谈傅里叶变换、小波变换、HHT变换

    千次阅读 多人点赞 2019-08-29 12:18:42
    当作原信号,重复上述步骤,则有: h 1 k ( t ) = h 1 ( k − 1 ) ( t ) − m 1 ( k − 1 ) ( t ) h_{1k}(t)=h_{1{(k-1)}}(t)-m_{1(k-1)}(t) h 1 k ​ ( t ) = h 1 ( k − 1 ) ​ ( t ) − m 1 ( k − 1 ) ​ ( ...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    CMMCMMI的区别 23 第五章 SQL 24 约束: 29 1主键约束 29 2 非空约束 not null 30 3 外键约束 FOREIGN KEY 30 4 默认约束 31 5 检查约束 check 31 6 唯一约束 unique 32 SQL语句 32 创建数据库. 32 表、字段、...
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)? ................................................................................................................................
  • 在使用maven开发项目的过程中,经常会遇到jar包重复加载或者jar包冲突的问题的,但是由于有些jar是由于maven的依赖加载自动加载进来的, 而不是开发者自己配置的,特别是当项目中pom中配置的jar包依赖本身很多时,...
  • 中台透彻讲解

    万次阅读 多人点赞 2019-06-27 21:59:01
    Supercell 的模式给参加此次拜访的阿里高管们很大的震撼,在大家反复的心得交流和讨论中,一个非常重要的问题引起了很多人的反思: 信息时代的公司架构到底应该是怎样的? 正是有了这次拜访才真正让阿里巴巴的...
  • 多次连续点击导致Ajax重复提交

    千次阅读 2016-12-19 16:05:14
    大家比较上面两段代码,可以看出区别: A段代码是正确的执行,B段代码是不能正确执行的。开始特别疑惑: $(this).addClass('disabled').attr('disabled', true);  和 $(this).removeClass('disabled').attr('...
  • 假定有以下几个头文件及其包含关系为:  File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp  那么:file3.h包含file1.h,file2....就会导致在file5中对file1和file2的反复包含,编译时就会报错。  解决方法1:
  • 给定一个字符串,找出不含有重复字符的最长子串的长度。 示例: 给定"abcabcbb",没有重复字符的最长子串是"abc",那么长度就是3。 给定"bbbbb",最长的子串就是"b",长度是1。 给定"pwwkew",最长子串是"...
  • 《数据库原理》— 数据库系统概论第五版习题解析

    万次阅读 多人点赞 2017-05-29 14:57:48
    文件系统数据库系统的区别是:文件系统面向某一应用程序,共享性差,冗余度大,数据独立性差,记录内有结构,整体无结构,由应用程序自己控制。数据库系统面向现实世界,共享性高,冗余度小,具有较高的物理独立性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,775
精华内容 26,710
关键字:

反复与重复的区别