解决考试系统高并发数据加载不正确问题

背景:

现在这版考试系统分为学生考试端和后台管理端。同一登陆页,学生输入学号、密码进入考试界面,管理员输入用户名、密码进入后台管理界面。平时没有学生考试时,后台管理界面学院下拉框可以正确的从数据库读取并加载数据,但有学生考试时,后台管理界面学院下拉框获取的数据有时为空,有时为脏数据。

我们所做的尝试:

1、再现数据加载不正确场景

用LoadRunner压力测试程序模拟255人在线考试的过程,发现当考试人数达到50人时,后台管理界面开始出现上述数据加载不正确问题。

2、验证数据库是否产生了死锁

我们在207服务器IIS上发布两套相同的考试系统A、B,A、B考试系统访问同一数据库,用LoadRunner模拟255人访问A系统,当A系统出现数据加载不正确问题时,用B系统登录后台管理,每次刷新数据都能正确加载。因此得出结论,不是数据库的问题,不然B系统也会出现数据加载不正确问题。

3、验证IIS分配给应用程序的虚拟内存和专用内存是否太小

我们用LoadRunner模拟255人访问考试系统,当系统出现数据加载不正确问题时,在IIS的应用程序池对考试系统进行回收操作,系统数据正确加载,一直刷新,过段时间数据又不能正常加载。我们在IIS的应用程序池把考试系统的虚拟内存和专用内存设置为最大值,刷新页面仍然出现数据加载不正确问题。

4、优化SQLHelper类

在SQLHelper中用到了很多Connection、SqlCommand、SqlDataAdapter、SqlDataReader,原来是放在Using中执行,为了确保上述操作在执行完后释放内存,又添加了try、catch、finally,在finally关闭SqlDataReader、SqlDataAdapter、SqlCommand、Connection,但结果数据仍是加载不正确。

5、在数据库连接串添加MultipleActiveResultSets=true属性

由于在报的黄页中有一个错误提示是“There is already an open DataReader associated with this Command which must be closed first”,所以尝试在数据库连接串添加MultipleActiveResultSets=true属性,允许在单个连接上执行多重的数据库查询或存储过程,但结果数据仍是加载不正确。

6、把数据库的连接池最大值由1200改为500

做了上述5步操作,问题还是没有解决,于是尝试着换个思路,数据库连接池是不是设置的太大了,把最大值由1200改为了500,问题解决。

我们可以在百度百科查一下数据库连接池的定义:数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

最小连接数与最大连接数相差太大:那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

原来数据库连接池最大为1200,最小为300。系统初始化时创建300个数据库连接,之后如果连接数超过300,则创建新的连接,可实际系统运行过程中并未用过这么多的数据库连接,造成数据库连接(是一种关键的有限的昂贵的资源)的浪费。

问题虽然解决,但仍然有一个疑问:“为什么数据库连接池最大值设置太大会造成数据加载不正确”?

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 23:38:09

解决考试系统高并发数据加载不正确问题的相关文章

解决考试系统高并发数据载入不对问题

背景: 如今这版考试系统分为学生考试端和后台管理端.同一登陆页,学生输入学号.password进入考试界面,管理员输入username.password进入后台管理界面.平时没有学生考试时.后台管理界面学院下拉框能够正确的从数据库读取并载入数据,但有学生考试时.后台管理界面学院下拉框获取的数据有时为空,有时为脏数据. 我们所做的尝试: 1.再现数据载入不对场景 用LoadRunner压力測试程序模拟255人在线考试的过程,发现当考试人数达到50人时,后台管理界面開始出现上述数据载入不对问题. 2

管理员登录系统后,却加载为TEMP用户的解决办法

win2008R2登录时要加载用户资料.可能是因为不能加载临时换成temp用户. 此时原来的Profile的文档并未丢失,只是以另一个用户登陆系统而已.但是需要同时注意的是,那也就意味着你做的任何变更,增加文件,更改背景等都将在注销后失效,不会保存. 遇到这个问题,可以尝试下先重启电脑,如果无法解决,可以根据以下步骤修改注册表. 1. 备份注册表2. 使用别的管理员账号登陆系统(并不是发生问题的那个)3. 如果用户Profile文件夹仍然存在,备份该Profile文件夹,然后删除.(Profil

【Android】解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题

解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题

Apache Spark技术实战之7 -- CassandraRDD高并发数据读取实现剖析

未经本人同意,严禁转载,徽沪一郎. 概要 本文就 spark-cassandra-connector 的一些实现细节进行探讨,主要集中于如何快速将大量的数据从cassandra 中读取到本地内存或磁盘. 数据分区 存储在 Cassandra 中数据的一般都会比较多,记录数在千万级别或上亿级别是常见的事.如何将这些表中的内容快速加载到本地内存就是一个非常现实的问题.解决这一挑战的思路从大的方面来说是比较简单的,那就是将整张表中的内容分成不同的区域,然后分区加载,不同的分区可以在不同的线程或进程中加

两种数据加载动画

android 数据加载动画: <FrameLayout android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/rl_loading" android:layout_width

winform如何实现将数据库数据加载到树上

一.简介 对于winform中如何加载xml生成目录树,在前边一篇文章"c#如何实现从xml中加载树目录,并且显示完整的Text"中我已经写了详细的过程.但是有些时候我们不可能将大量的数据存储到xml中,原因是,xml一般用于小数据量的传递.而大数据的存储与传递我们一般用专门的数据库管理工具作为传递的介质.在此,声明一点是,对于大数据量的传递,我们在这里不考虑速率传递快慢问题,我们举例只是实现最基本的功能,这样也方便和我一样的初学者理解. 好了,说了这么多废话,开始正式进入我们这篇文章

【颗粒归仓】(一)jQuery easyui datagrid 的数据加载

其实easyuidatagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数据:另一种是加载js对象,也就是使用loadDate方法,这种方法用于加载本地js数据(非url调用).在项目中我用到的以及研究别人代码中用到的普遍是第一种,下面就分别对他们进行总结. 一.ajax加载目标url返回的json数据 首先明确,通过ajax加载目标url返回的值不一定是json格式,在http://blog.csdn.net/luckystar689/article/details/5

GreenPlum数据加载

1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行数据加载,数据需要经过Master节点分发到Segment节点,同样使用copy命令进行数据卸载,数据也需要由Segment发送到Master节点,由Master节点汇总后再写入外部文件,这样就限制了数据加载与卸载的效率,但是数据量较小的情况下,copy命令就非常方便.下面测试通过copy命令实现操

实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624.aspx  译 Q:77811970 实现虚拟模式的原因之一 DataGridView控制只检索数据,因为它是必要的. 这就是所谓的 即时数据加载 . 如果你正在与一个非常大的表在一个远程数据库,例如,您可能希望避免启动延迟,只检索所需的数据显示和检索额外的数据只有当用户新行滚动到视图. 如果客户