前段时间写了一个Demo项目,客户端通过网络连接,访问netty实现的一个后台获取数据。
虽然后台netty的工作任务也是通过线程池来完成相应的任务处理,但是偶现客户端在读取数据时,读取的线程给卡住,读不到数据,并且只是偶尔出现,试过了很多次,每次在观察的时候都没有重现,甚至有压力测试都没有出现过,本地Debug也没有任务问题,通过每一步加日志,发现任务加到线程池之后最终并没有执行,线程池满掉了,开始怀凝是不是某一步出现了死锁,再仔细检查几轮代码,都没有什么点可能出死锁。
多次出现问题之后,发现有一个规律:“往往出问题的时候,长时间没有访问后台,然后再去访问的时候比起平常访问更容易出现”
由以上规律猜测,可能是后台的某个资源被释放或者因为过期失效,而用到的资源又只有数据库,spring配的C3P0的数据库连接池。查看配置文件:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://xx.xx.xx.xx/xxx"/> <property name="user" value="xxx"/> <property name="password" value="xxx"/> <property name="minPoolSize" value="1"/> <property name="maxPoolSize" value="20"/> <property name="checkoutTimeout" value="10000"/> <property name="maxStatementsPerConnection" value="50"/> <property name="testConnectionOnCheckout" value="true"/> </bean>
配置中连接checkout是有检查的,超时也不长,按道理应该是没有问题的啊
仔细看了这参数的解释,testConnectionOnCheckout是在checkout的时候,通过对数据进行一次查询或者JDBC4以上和C3P00.9.5以后会去调用isValid() 来检查,原理都可以理解为对数据库进行一次最简单的查询。
然后也查到mysql在长时间没使用的连接,是会出现卡死的现象,也就是idle状态,联想到之前过出现C++访问Mysql也有这种问题,最后自己写了个线程,隔段时间做一次简单查询来解决,实际上我的这种情况很在checkout的时候就已经卡死,而又不是连接超时,也不是checkout超市,再看了下C3P0的参数配置,还有一个idleConnectionTestPeriod,这个就是定时去“激活”一下闲置的连接,加上之后,万事大吉,问题再也没有出现过了。另个还有一个参数官方也建议加上,配合使用,最终配置如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/><!-- 203.195.235.154 119.29.178.28--> <property name="jdbcUrl" value="jdbc:mysql://xx.xx.xx.xx/xxx"/> <property name="user" value="xxxxx"/> <property name="password" value="xxxx"/> <property name="minPoolSize" value="1"/> <property name="maxPoolSize" value="20"/> <property name="checkoutTimeout" value="10000"/> <property name="maxStatementsPerConnection" value="50"/> <property name="automaticTestTable" value="pooltest"/> <property name="testConnectionOnCheckout" value="true"/> <property name="testConnectionOnCheckin" value="true"/> <property name="idleConnectionTestPeriod" value="60"/> </bean>
automaticTestTable,这是可选,表示连接池做测试的时候,访问的一个表名,会自动创建,执行select 1之类的语句,表创建之后不需要手动进行修改。
记下来以备忘。
相关推荐
在使用PL/SQL Developer或其他Oracle数据库管理工具时,可能会遇到一个常见的问题:执行SQL语句或存储过程时,系统长时间无响应或者卡住。这种情况不仅影响工作效率,还会消耗大量的时间和精力去排查原因。本文将...
然而,当PostgreSQL服务启动后占用CPU达到100%,甚至导致系统卡死,这显然是一个严重的问题。本文将探讨这个问题的可能原因及解决方案。 首先,我们要理解PostgreSQL为何会消耗大量CPU资源。这通常与以下因素有关:...
鸿威软件是一款广泛应用于零售业的管理软件,它涵盖了收银、库存、会员管理等多个方面。以下是对鸿威软件常见问题的详细解答: 1. 建立收银网络:在多台收银前台与后台电脑之间建立网络连接,确保所有设备在同一...
- 数据绑定:通过ADO(ActiveX Data Objects)或BDE(Borland Database Engine)组件,将前台的控件与后台的SQL数据库连接,实现数据的实时显示和更新。 - 数据访问对象(DAO):使用TClientDataset等组件,封装...
读写分离,支持MySQL双主多从、一主多从模式,支持全局表,数据自动分片到多个节点,用于高效表关联查询,支持独有的基于E-R关系的分片策略,实现了高效的表关联查询,支持一致性Hash分片,有效解决分片扩容难题,多...
在使用Windows XP操作系统时,可能会遇到系统突然卡顿的情况,其中一个常见的现象就是CPU占用率达到100%,这会导致电脑运行速度变慢甚至完全卡死。本文将详细介绍导致XP系统中CPU占用率100%的常见原因以及相应的解决...
项目获取不到或登录报错,可能是数据库配置问题,需要检查数据库连接字符串、用户权限和项目发布设置。 21. **用户登录状态无效**: 用户登录状态无效可能涉及会话管理,检查会话超时设置和用户认证逻辑。 22. *...
通过实例化`Thread`对象并调用`Start`方法,我们可以启动一个新的执行线程来处理后台任务。 5. **配置文件读取**:在启动后台任务之前,可能需要从配置文件中读取相关信息,如数据库连接字符串、操作参数等。这通常...
解决了之前因为程序代码问题造成的不能建吧的问题 解决了单吧版有参数的问题,更有利于搜索 解决了之前的一系列细节问题 减小了程序占用的空间,不到800K 此为本贴吧程序GB2312编码的最终版本,后续版本将使用utf-8...
淘宝API电子商务网站是一个基于淘宝开放平台接口开发的网站应用,主要目的是为了集成淘宝的商品、订单、用户等数据,实现与淘宝平台的交互。这个网站可能存在一些功能性和性能上的问题,根据描述,我们可以深入探讨...
ajaxinc: AJAX应用类(以ajax_命名的四个文件)、附件上传(upload_5xsoft.inc|asoft_upload.asp)和EXCEL导出文件(toexcel.asp)、顶部banner(top.asp)、验证码生成文件(CodeGen.asp、VerifyCode.asp),数据库连接文件...
通过检查系统的`/proc/meminfo`文件,发现系统总内存为48GB,但Oracle的`memory_max_target`和`memory_target`参数被设置为了20480GB,这是一个明显超过系统物理内存的值,因此数据库在尝试分配内存时会遇到问题,...
2 请注意修改web.config中数据库连接信息,否则连接不上你的数据库 3 修改商品信息使用了漂亮的弹窗效果,请配置弹窗图片资源绝对路径,否则出现卡死现象! opennew/Dialog.js这个文件中第一行代码: var ...
5. **MySql.Data.dll**:这是MySQL数据库连接的.NET数据提供程序,表明关关采集器可能支持与MySQL数据库的交互,便于用户将采集的数据存储在MySQL服务器上。 6. **ChnCharInfo.dll**:这个库可能包含关于中文字符的...
水平切分则是将一个表的数据按照一定的规则(如取模运算)分成多个子表存储在不同的数据库中,这种方式可以极大地提高数据的读写效率,尤其是在数据量非常大的情况下。 #### 二、Mycat前世今生 Mycat作为一款成熟...
在数据库操作中,尤其是当涉及大量数据的读取、修改和写入时,进度条同样可以帮助用户跟踪操作进度,尤其是在网络连接不稳定或数据库响应时间较长的情况下。 在C#中实现进度条,可以使用Windows Forms或WPF...
其目的是在等待数据完全加载期间,提供一个反馈机制,让用户知道程序正在运行且并未卡死。在C#中,这通常通过使用线程或异步编程来实现。例如,可以使用`BackgroundWorker`组件在后台执行任务,同时在主线程上更新UI...
2、打开config/config.php,根据提示配置好你的数据库连接信息 3、进入后台:你的网址/yjadmin/ 默认帐号和密码均为admin 4、进入后台后点击左侧的基本设置,把网址改成你的当前网址就行了,记得要加上反斜杠/, ...
【新增】添加一个新的模板! 【新增】模板切换功能!(切换后需更新网站!) 【新增】在线升级功能 【新增】用户可自定义小游戏贴片广告! 【新增】标签按最新标签、游戏ID生成标签 【新增】最近玩过的游戏 ...