php - 成千上万的插入,我有重复的值,为什么?
问题描述
我有一个应用程序,它是一个停车场系统,我的客户经常使用它来向我的数据库发送来自汽车的数据条目。
这是发送到我的服务器的代码:
public void sendEntradaRotativaDataToServer(String url){
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Processando entrada..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
JsonObject json = new JsonObject();
json.addProperty("placa", entradaObj.getPlaca());
json.addProperty("dataemissao", entradaObj.getDataemissao());
json.addProperty("tipo", entradaObj.getTipo());
json.addProperty("valor", entradaObj.getValor());
json.addProperty("area", entradaObj.getArea().getId());
json.addProperty("observacao", entradaObj.getObservacao());
json.addProperty("user_id", entradaObj.getUser_id());
Ion.with(getActivity())
.load(url)
.setTimeout(5000)
.setJsonObjectBody(json)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
if (e != null) {
newMsgWarn("Atenção","Não foi possível fazer uma conexão por favor tente novamente");
if(pDialog != null && pDialog.isShowing()){
pDialog.dismiss();
}
} else {
success = result.get(TAG_SUCCESS).getAsInt();
message = result.get(TAG_MESSAGE).getAsString();
entradaObj.set_id(result.get("entradaid").getAsString());
(new SyncEntrada()).execute(new String[0]);
if(pDialog != null && pDialog.isShowing()){
pDialog.dismiss();
}
}
}
});
}
这是 Ion 库的简单发布请求,这是服务器上的代码(我在项目中使用 laravel):
public function insertDataRotativa(Request $request) {
if(isset($request)) {
$dataentradaini = Carbon::parse($request->input('dataemissao'));
$evento = $this->mdUtil->getEventByDataEmissao($dataentradaini);
if (!empty($evento)) {
foreach ($evento as $value) {
$this->mdEntrada = new Entrada;
$this->mdEntrada->placa = $request->input('placa');
$this->mdEntrada->created_at = $dataentradaini;
$this->mdEntrada->updated_at = $dataentradaini;
$this->mdEntrada->tipo = $request->input('tipo');
$this->mdEntrada->valor = $request->input('valor');
$this->mdEntrada->area = $request->input('area');
$this->mdEntrada->observacao = $request->input('observacao');
$this->mdEntrada->user_id = $request->input('user_id');
$this->mdEntrada->evento_id = $value->id;
$this->mdEntrada->flag = "U";
$this->mdEntrada->save();
}
}else {
$this->mdEntrada = new Entrada;
$this->mdEntrada->placa = $request->input('placa');
$this->mdEntrada->created_at = $dataentradaini;
$this->mdEntrada->updated_at = $dataentradaini;
$this->mdEntrada->tipo = $request->input('tipo');
$this->mdEntrada->valor = $request->input('valor');
$this->mdEntrada->area = $request->input('area');
$this->mdEntrada->observacao = $request->input('observacao');
$this->mdEntrada->user_id = $request->input('user_id');
$this->mdEntrada->flag = "U";
$this->mdEntrada->save();
}
$response["success"] = 1;
$response["message"] = "Entrada efetuada com sucesso.TIPO:1";
$response["entradaid"] = $this->mdEntrada->id;
return $response;
}
我猜是用户按了这么多次按钮发送,但我在按钮上设置了启用和不启用的时间,不会同时发出很多请求,这里是按钮的代码:
sendButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
YoYo.with(Techniques.BounceIn)
.duration(500)
.playOn(v.findViewById(R.id.entradabt));
if (SystemClock.elapsedRealtime() - mLastClickTime < 3000){
return;
}
mLastClickTime = SystemClock.elapsedRealtime();
enviarEntrada();
}
});
为什么我有这种重复的记录?有小费吗?
这是我的架构
解决方案
Unique_Key
在 Created_at、Updated_at 和 Placa Seeing 上添加唯一键,因为这可能是该表的唯一标识符。这可以防止同时插入。
还要检查一个请求是否多次发送相同的请求,并通过 PLACA(carplate?)过滤掉它们(一个请求中只能发送 1 个 placa)。
可能很方便?
如果相同的 PLACA 在支付相同请求后的 1 分钟内发送,则忽略它。(SQL 查询过滤器,在最后一分钟内请求所有事务并检查 (carplate)placa 是否存在)。
result = SQL Query select all where placa is within 1 and or 2 min;
if(result is same PLACA as request){ return; and ignore request)
一些伪代码可以提供帮助。
推荐阅读
- oracle - 如何选择列表但从 Oracle 数据库返回行
- javascript - 在jquery中设置宽度
- azure - Azure 文件存储/文件共享 - 端口 445 - 为什么
- python - 美化/缩短连接的for循环
- python - 我的计时器似乎很不对劲-我该如何解决/我做错了什么?
- javascript - Javascript 检查给定键的值是否存在于字典数组中
- oracle - 数据类型从 varchar2 到日期、数字等的隐式转换
- javascript - 获取 N 大小的数字,加起来等于数字 X
- mongodb - MongoDB 无法使用 DataGrip 为文本索引设置 default_language
- python - 带有 python 自定义模块的 aws lambda