概述:
在对后端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内存溢出(Out Of Memory, OOM)是开发者在编程过程中经常遇到的问题,尤其是在处理大量数据或长时间运行的应用程序时。本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space...
JCA(Java Core Analysis)456是一款专门用于解析和分析Javacore文件的工具,它能帮助开发者更高效地理解和解决WebSphere中的内存问题。JCA 456提供了丰富的功能,包括: 1. **线程分析**:展示JVM中的所有线程状态...
jprofiler的使用及联调内存溢出解决方案交流 jprofiler 是一个全功能的 Java 剖析工具,...jprofiler 是一个功能强大且多功能的 Java 剖析工具,能够帮助开发者快速定位和解决内存溢出问题,提高程序的性能和可靠性。
本文将详细介绍三个重要的组件:C3P0连接池、MySQL的JDBC驱动(mysql-connector-java-5.1.37)以及Druid连接池,以及它们在Java中的应用和作用。 首先,C3P0是一个开源的JDBC连接池,全称为ComMchange V2 C3P0。它...
5. 线程安全:在多线程环境中,连接池的创建、分配和回收操作必须是线程安全的,防止数据竞争和死锁。 在Java中,可以使用Apache Commons Pool库来实现Socket连接池,或者自定义一个基于LinkedList或...
- 关注连接池的监控和日志记录,以便诊断和解决性能问题。 总之,Java数据库连接池是优化数据库访问性能的关键技术,它通过复用数据库连接和高效管理资源,提高了应用程序的效率和稳定性。在开发过程中选择一个成熟...
java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...
本文将深入探讨这两个主题以及如何解决内存溢出问题,以帮助你在笔试和面试中表现出色。 首先,我们来理解堆栈。堆栈是一种特殊的内存区域,遵循“后进先出”(LIFO)原则,主要用于存储程序运行过程中的函数调用...
诊断内存溢出通常需要利用内存分析工具,如Valgrind(C/C++)、JProfiler(Java)、VisualVM(Java)等,这些工具可以帮助开发者定位内存泄漏的位置,查看对象生命周期和内存分配情况。 ...
"JAVA内存泄漏分析工具"正是一款用于解决此类问题的专业工具,它能帮助开发者定位并修复内存相关的问题,如内存泄漏和内存溢出。 内存泄漏是程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能看似...
在Java编程中,死锁和生产者消费者问题是多线程编程中的两个重要概念,它们涉及到并发执行和资源管理。理解并正确处理这些问题对于构建高效、可靠的多线程应用至关重要。 死锁是指两个或多个线程在执行过程中,因...
4. 检测和恢复:通过算法检测是否即将进入死锁状态,并采取措施,如回滚事务,释放部分锁等。 "Java.jpg"文件可能是一个关于死锁的流程图或者示意图,帮助直观理解死锁的发生过程。 总之,理解并避免Java中的死锁...
Java多线程编程是开发高并发应用的关键技术之一,但随之而来的是各种复杂的问题,其中最令人头疼的就是死锁。死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。JCarder是Java中用于检测...
线程死锁是 Java 编程中的一种常见的问题,它可以导致程序的崩溃或性能下降。为了避免线程死锁,我们需要在设计线程之间的交互时,遵循一定的规则和原则,例如避免循环等待、使用锁对象和线程通信机制。
此外,定期检查连接池的健康状况,及时处理死锁、泄露等问题,确保系统的稳定运行。 通过正确配置和使用这两个连接池包,开发者可以高效地在MySQL和Oracle数据库之间切换,提高应用程序的灵活性和性能。
DELPHI7编写的ADO连接池是数据库应用开发中的一个重要技术,它主要用于管理和优化数据库连接,提高系统性能并防止可能出现的死锁问题。在多用户同时访问SQL数据库时,如果没有有效的连接管理,可能会出现资源竞争,...
Java数据库连接池(Database Connection Pool)是Java应用中用于管理数据库连接的重要技术,它通过复用已存在的数据库连接,减少了创建和销毁连接的开销,从而显著提升了应用程序的性能和效率。BoneCP是一款高效的...
C3P0连接池是Java应用中常用的数据库连接池组件,它允许程序在不关闭物理连接的情况下,管理和重用数据库连接,从而提高了应用程序的性能和效率。C3P0库依赖于其他几个JAR包来实现其功能,包括`c3p0-0.9.2.1.jar`、`...
本篇文章将详细探讨jProfiler7在Java内存分析上的核心功能、使用方法以及在Linux环境中的配置和应用。 1. **内存分析概述** - 内存分析是识别和解决Java应用程序中的内存泄漏、过度对象创建和内存消耗过高问题的...
本文将深入探讨如何使用`synchronized`来解决Java中的死锁问题。 首先,我们需要理解死锁的四个必要条件: 1. 互斥条件:至少有一个资源必须在任何时候只能由一个线程使用。 2. 请求与保持条件:一个线程因请求被...