概述:
在对后端java抓取微博数据系统从1.0升级到2.0的过程中,产生了一些严重的问题,经过调整后,目前这些问题未再出现。
问题1:
现象:前端页面数据混乱,A用户的数据混杂了B用户的数据,并且现象比较普遍。
原因:新浪基于JAVA语言SDK的V2版本存在BUG,有并发问题。
引起该问题的主要是SDK中的一个封装类:HttpClient。
因为该类为全局静态共享类,该类中的属性也同样成为全局共享类,在并发情况下,会导致部分属性的值被篡改,从而引起数据混乱。
解决办法:将该类中会导致并发问题的属性删掉,改为从方法参数中传入该值,改完后经反复测试,目前该问题未再复发。
问题2:
现象:后端抓取日志出现连接池死锁、长时间获取mysql连接失败以及内存溢出异常的现象。该现象比较混乱,各种错误混到一起,使得查找问题都不太容易。
原因:
1,把java数据库连接池框架c3p0的日志打开后,发现c3p0存在死锁问题。
2,部分SDK接口短时间内会返回大量的数据,可能因此而导致堆溢出。
3,代码中的预处理sql会导致长时间获取mysql连接失败。
解决办法:
针对问题1:更换连接池,经过一番调查和比较之后,选定淘宝开源连接池druid。经部署测试后,死锁问题未再出现。
针对问题2:
首先,错误日志显示为“java.lang.OutOfMemoryError: Java heap space”,于是增加java虚拟机的最大堆内存,后发现问题仍然存在内存溢出,
不过错误日志信息变为了“java.lang.OutOfMemoryError: GC overhead limit exceeded”。
其次,通过对错误日志的分析,发现每次出现该问题时,都会有“提到我的微博”等抓取任务在运行,
于是修改了“提到我的微博”和“个人微博信息”等业务中每页返回的微博数,并调小部分代码中涉及到操作数的地方。
同时修改carry端启动脚本,在java命令后加入参数“-XX:+UseGCOverheadLimit”,之后内存溢出问题消失。
针对问题3:这个问题找了很长的时间,调整了很多连接池的参数和java启动参数,并使用java内存监控工具分析和诊断。
最初认为是连接的空闲时间过长,空闲连接未被释放导致该问题,于是在druid连接池中加入一个参数“removeAbandoned”,
该参数会检测长时间未释放的空闲连接,若发现有这样的空闲连接并且空闲时间超过设定的时间,则会抛异常,并强行终止这种连接。
通过连续监控,并未发现预料中的强行终止异常,问题仍然重现。
最后通过对大量错误日志的分析,发现所有出现该问题的地方都会出现预处理sql,于是将代码中所有涉及到预处理sql的地方全都改成正常的普通sql,部署后问题未再出现。
分享到:
相关推荐
java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...
java 一个死锁的例子 java 一个死锁的例子 java 一个死锁的例子
java线程实践,了解线程死锁,同步问题
Java解决死锁问题eclipse代码版
死锁and生产者消费者问题
该工具用来排查线上程序出现内存泄漏或溢出,死锁等相关问题,快速分析堆栈异常情况,找到问题代码进行修复。
Java多线程程序死锁检查 JCarder
源码—Java多线程5—死锁和wait notify notifyAll
Java中死锁的例子,非常的例子。经过本人验证
这是和死锁有关的问题,和简单的一个例子!
死锁避免——银行家算法的模拟实现 java源代码 java源代码 java源代码 java源代码 java源代码
死锁问题是个写代码过程中可能遇到的问题,这是我学习中看到的例子
Java的synchronized关键字用来进行线程同步操作,然而这在使用中经常会遇到一些问题,这里我们就来详解Java中synchronized关键字的死锁和内存占用问题:
java多线程死锁预防机制研究,java多线程死锁预防机制研究
操作系统实验六:死锁问题实验报告。通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。...掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
本源代码是博客《Java 多线程编程之七:死锁(附源代码)》附带的实例性源代码。原博客链接地址:http://blog.csdn.net/defonds/archive/2010/01/26/5258120.aspx。
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
主要介绍了Mybatis update数据库死锁之获取数据库连接池等待的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
Java死锁的问题分析与研究