后台报错

03-Mar-2018 20:39:34.260 警告 [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@57a3356 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (2). Last acquisition attempt exception: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"at sun.reflect.GeneratedConstructorAccessor223.newInstance(Unknown Source)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)at com.mysql.jdbc.Util.getInstance(Util.java:372)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:958)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1037)at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2239)at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2270)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2069)at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:794)at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)at sun.reflect.GeneratedConstructorAccessor221.newInstance(Unknown Source)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

前台也发现了问题

在文件上传模块,出现了一个很不寻常的问题。在打开的文件上传窗口中,我填好信息,点击提交。发现发起了多次请求。把选项卡关掉,再试一下,请求次数又加一了。再关,再试,发出的又多一次(如下图)。

超级郁闷。我明明只是发起了一次请求。为什么会发出那么多个请求。如下图:

在确定后端代码无误后,我怀疑是因为前端我错误的使用了easyui的tabs选项卡。

找到问题所在

通过查看页面的元素,我发现,当我关闭选项卡后再打开新的选项卡,原本的选项卡中的元素依然还在。
我的操作如下:
1、点击左侧的菜单栏(结果是右侧出现一个选项卡)
2、关闭选项卡
3、点击左侧的菜单栏
4、关闭选项卡
5、循环执行
其中每执行一步操作都查看浏览器F12开发者工具中的页面元素源码。
结果发现,每次点击左侧的菜单栏,页面都会在尾部添加一段html代码,这段代码就是选项卡中显示的内容。而每次关闭选项卡,这段代码却没有被移除!!!
如下图:

这样,我就明白——为什么在弹窗中点击提交,会出现发起多次请求的问题了。因为每当我打开选项卡又关闭选项卡,对应的html代码段并没有被移除。

其中,被加载进来的html代码包含着表单,如:

<div id="wu-dialog" class="easyui-dialog" data-options="closed:true,iconCls:'icon-save'" style="width:400px; padding:10px;"><form id="wu-form" method="post" enctype="multipart/form-data"><table><tr><td width="60" align="right" hidden>id:</td><td><input type="text" name="id" class="wu-text" hidden/></td></tr><tr><td width="60" align="right">文件标题:</td><td><input type="text" name="title" class="wu-text" /></td></tr><tr><td align="right">文件描述:</td><td><textarea name="remark" rows="6" class="wu-textarea" style="width:260px"></textarea></td></tr><tr><td align="right">文件:</td><td><input type="file" name="file"/></td></tr></table></form>
</div>

因此,当我打开选项卡又关闭选项卡,打开又关闭,页面上就会有多段被加载进来的html代码,而如果我多次打开的是同一个内容,那么加载进来的html代码就是相同的。这样!就导致了页面中有包含着多个表单。

而其表单提交的相关脚本代码:

$('#wu-form').form('submit', {url:'/document/upload',success:function(data){if(data){$.messager.alert('信息提示','上传成功!','info');$('#wu-datagrid').datagrid('reload');$('#wu-dialog').dialog('close');}else{$.messager.alert('信息提示','上传失败!','info');}}
});

也就是说这是通过id选择器选中对应的控件,然后执行提交操作。而由于我页面中加载了多段一样的html代码,因此就会出现多个id都为“#wu-form”的表单,因此也就导致了发起多次请求!

ps:如果是在jsp中书写代码,是不允许出现id相同的控件。但是动态加载的方式却能实现。

解决问题

我前端框架使用的是EasyUI。

之所以会出现这个问题,我想是因为我错误的使用easyui的tabs控件。

在此之前,项目中是有这么一个bug的:当第一次点击菜单栏的其中一个选项,会出现一个选项卡,并且数据能加载出来。当点击另一个选项,会出现新的一个选项卡。但是其数据却不能正常加载出来。然后我发现,只要在打开一个新的选项卡之前,先把旧的选项卡给关闭,就不会出现这个问题了。

因此,在测试的时候,也就出现了“点击菜单栏的a选项,然后出现一个选项卡,关闭该选项卡,再点击菜单栏的a选项…”这样的循环操作了。因此,也就出现了发起多次请求的问题。

我理了一下逻辑:当点击菜单栏的其中一个选项的时候,会触发一个方法,会打开一个新的选项卡,并把相应的html代码加载到其中。

因此,我的想法就是在打开一个新的选项卡之前,调用一个方法把旧的选项卡给关掉,再调用另一个方法并把旧的html代码给移除掉。

怎么把旧代码移除呢。通过观察网页元素,发现被加载进来的这段html代码是两个div,而其中的class如combo-p和window是其独有的:

因此可以通过JQ的类选择器选中这两个控件并调用remove方法将其移除:

$(".combo-p").remove();
$(".window").remove();

这样,通过代码形式来实现打开一个新的选项卡前将旧的选项卡关闭,就不会出现新的选项卡数据加载不出来的问题。通过代码形式移除旧的html代码,就不会出现一次提交发起多次请求的问题了。

我想归根结底。还是因为我错误的使用了easyui的tabs。该界面是基于网上的一个模板自己改的,可能由于没有理解tabs的使用,因此才会出现这个怪异的现象。

总结

一次提交,发起多次请求的问题,很可能因为是因为在执行提交的时候,是通过触发一个脚本方法实现的。而脚本方法又是通过JQ来选中表单控件,如果页面中有多个表单,而多个表单控件都被JQ选择器选中,那么就会出现一次提交发起多次请求的问题。

当然了这只是其中一个可能的原因,可以参考一下。

一次提交却发起了多次请求的一种可能的原因相关推荐

  1. layui表单提交使用form.on(‘submit(sub)‘,function (){}) 使用ajax请求时回调不执行的原因及解决方法

    layui表单提交使用form.on('submit(sub)',function (){}) 使用ajax请求时回调不执行的原因及解决方法 参考文章: (1)layui表单提交使用form.on(' ...

  2. php 向py发起请求,Python向PHP发起GET与POST请求

    CloudBean项目中到PHP开发WEB管理端,用Python开发服务控制端,在项目中Python的服务控制端有时候需要主动连接PHP的WEB管理端下载或上传配置参数或数据信息,这里采用的原理是Py ...

  3. python实现get请求 模块_python爬虫 基于requests模块发起ajax的get请求实现解析

    基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...

  4. golang使用http client发起get和post请求示例

    golang使用http client发起get和post请求示例 golang要请求远程网页,可以使用net/http包中的client提供的方法实现.查看了官方网站有一些示例,没有太全面的例子,于 ...

  5. 【 微信小程序请求封装】【进阶版】处理401请求token过期--重新登录--重新发起刚才过期的请求

    微信小程序请求封装(拦截器):处理请求过期–重新登录–重新发起刚才过期的请求 env.js //这里使用的接口呢都是自己模拟的,可以根据自己的需求进行添加module.exports={//开发环境的 ...

  6. Vue3(撩课学院)笔记09-axios简介,发起get请求的两种方式,发起带参的get及post请求,发起并发请求,并发请求结果将数组展开,axios全局配置,axios配置及封装,请求和响应拦截

    1.axios简介 axios是基于promise可以用于浏览器和node.js的网络请求库,在服务器端使用原生node.js,在浏览气短使用ajax(即XMLHttpRequests) 2.axio ...

  7. 模拟发起http请求的几种方法

    如何使用http协议调用服务器端的服务. 在日常工作中很多时候我们会需要测试自己提供出来的方法, 很多时候一些方法跨平台提供给第三方使用,一般与服务器通信协议都选择http协议, 建议可以去仔细学习一 ...

  8. java的connect和http_java发起HttpURLConnection和HttpsURLConnection请求 | 学步园

    /** * 发起https请求并获取结果 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET.POST) * @param outpu ...

  9. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因...

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  10. vue ajax提交防止伪造,axios+vue防止点击提交按钮而发送多次请求

    问题:如图,当我连续点击提交按钮多次,后台会接收到多次数据. image.png 在网上找了下方法,结合自己实际的问题,解决如下(参考文章:https://www.jianshu.com/p/4445 ...

最新文章

  1. [html] 举例说明锚点定位有什么作用?
  2. aioserve oracle,oracle进程关不掉的问题??新手问题
  3. 电脑基础操作_学电脑到万科!怀集万科电脑培训2019全面招生!
  4. JavaWeb——springMVC异常处理器
  5. mock server java_1分钟搭建极简mock server
  6. 利用Python在统计局网站爬取统计年鉴
  7. 什么是软件危机?它有哪些典型表现?为什么会出现软件为危机?
  8. Python 计算思维训练——数组和曲线绘制练习(一)
  9. 将字体变成红色加粗字体
  10. 2023江西财经大学计算机考研信息汇总
  11. Macbook Pro(MBP)上固态硬盘SSD,光驱位装HDD
  12. 1123_AURIX_TC275_DAP接口学习
  13. 计算机毕设网页设计源码——HTML+CSS+JS+Bootstrap在线音乐试听播放网站模板
  14. SIGCHLD信号(重点)
  15. FPGA 之 SOPC 系列(一)
  16. 桂花林上,再读“六项精进”
  17. 阿里测试7年经验,从功能测试到自动化测试,我整理的超全学习指南
  18. QT报错:error dependent 'xxx' does not exist.
  19. html待办事项表格代码,jQuery待办事项列表
  20. 【Unity3D插件】AVPro Video1.x 安卓端所有路径均无法播放

热门文章

  1. [jzoj100047]【NOIP2017提高A组模拟7.14】基因变异
  2. 二维码生成(带文字)
  3. Java面试评语及录用建议_面试录用评语.doc
  4. JAVA实现K-means聚类
  5. MBP TouchBar自定义使用
  6. linux spec cpu,SPEC CPU2006的安装和使用
  7. 神来之笔,2021CTF内核漏洞精选解析
  8. Codeforces - Ivan and Burgers
  9. 普通用户与root用户的相互切换
  10. [渝粤教育] 西南科技大学 会计电算化 在线考试复习资料2021版