50个客户端对Sql Server根本不成问题
应该是用了悲观锁的问题吧把你提交sql语句的代码贴出来看看吧包括你的测试语句,和实际程序中的语句
应该是用了悲观锁的问题吧把你提交sql语句的代码贴出来看看吧包括你的测试语句,和实际程序中的语句
解决方案 »
- 在线等!!!一组数,想取得最大值并且输出最大值的个数
- 关于dataset占用内存问题?
- C#新项目发布,继续散分,没有下载到的到这里下载
- 如何在TreeView中查找绑定的内容呢?
- 简单问题:读一个xml文件然后转为 string
- Paradise_heida大虾,可以问问你吗(关于删除数据)?
- ★200高分求一winform下的QQ菜单。
- 我的下拉菜单选择的内容,在用户按确定后在labble中显示出来,可是现在确定没有反映了
- 急:我的.NET怎么没有System.Windows.Forms.Design.ControlDesigner类库?
- 在服务器上发布aspx网页;
- 我在C#编写的程序中生成一个Cookie,可是却没有在硬盘上找到相应的文件,为何?
- 把数据读入变量中?轻易得分!!
假定能,我建议你采用三层结构。测试语句例如 Insert into a(col1,col2)value(var1,var2);
for (int i=0; i < 20000;i++)
{
数据库连接请求
事物处理语句块
完成后,关闭数据库连接
}能否把这个“事物处理语句块”去掉?换成中间层来处理
前台只是调用中间层的接口程序,事务在中间层启动,
去除“数据库连接请求”
去除“完成后,关闭数据库连接”
针对抢劫问题,建议中间层采用回调函数往客户端发送已经被抢了的记录的标示和新增的记录的标示回调函数:
回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。本文不准备介绍这些函数和过程,而是谈谈实现自己的回调函数的一些经验。 之所以产生使用回调函数这个想法,是因为现在使用VC和Delphi混合编程,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成之后,需要通知使用DLL的应用程序:某些事件已经完成,请处理事件的后续部分。开始想过使用同步对象,文件影射,消息等实现DLL函数到应用程序的通知,后来突然想到可不可以在应用程序端先写一个函数,等需要处理后续事宜的时候,在DLL里直接调用这个函数即可。于是就动手,写了个回调函数的原形。在VC和Delphi里都进行了测试。 http://www.legalsoft.com.cn/Articles/ArticleBrowse.asp?idArticle=369关于回调函数,你可以在Google上搜索,还有好多更详细的解释
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskPerformingOptimisticConcurrencyChecking.aspHandling Data Concurrency Using ADO.NET:
http://msdn.microsoft.com/msdnmag/issues/04/09/datapoints/
SQL中的连接使用缓冲池,假使真的有的操作非要关闭这个连接,你也完全可以在你运行
for (int i=0; i < 20000;i++)
{
数据库连接请求
事物处理语句块
完成后,关闭数据库连接
}
的时候不去关闭数据库连接,因为这时候根本没有时间去动作其他的数据库操作其次,你可以把你说的非要重新连接的地方贴出来,我到现在根本没有遇到
还有,只要连接的缓冲不超过SQL的极限,不存在要关闭连接的需要。另外,你的这个连接在你的程序中可以是全局的,无须到处申明连接。采用回调函数是解决你的问题的一种方法,因为它可以主动通知你的客户端,而无须客户端主动查询。
首先,我会调用函数,从注册表中取出数据库链接字符串
public string sGetPMConn()
{
string sDBServer = ""; // 服务器名
string sDBName = ""; // 数据库名
string sLoginname = ""; // 登录名
string sLoginpassword = ""; //登录密码
string sFullConn = "";
RegistryKey hklm = Registry.LocalMachine;
RegistryKey Practechkey = hklm.OpenSubKey("software\\practech",true);
sDBServer = (string)Practechkey.GetValue("DBServername");
sDBName = (string)Practechkey.GetValue("Databasename");
sLoginname = (string)Practechkey.GetValue("Loginname");
sLoginpassword = (string)Practechkey.GetValue("Password");
sFullConn = "data source="+sDBServer+";initial catalog="+sDBName+";persist security info=False;user id="+sLoginname+";password="+sLoginpassword+";workstation id=KWAHSERVER2;packet size=4096"; //数据库连接串组合 return sFullConn;
}程序中的调用
string sConn = PMCon.sGetPMConn(); // 数据库连接
SqlConnection PMConnection = new SqlConnection(sConn); //创建公用的数据库连接
if(_iRun != 1)
{
SqlCommand PMCommand = new SqlCommand(sAppendUser,PMConnection);
try
{
PMConnection.Open();
PMCommand.ExecuteNonQuery();
Form1.panel1.DrawColor = 3;// 个性化状态栏--颜色
Form1.panel1.Text = "Successfully!"; // 个性化状态栏--文字
this.Close();
}
catch(Exception E_SQLERROR)
{
er.vWrLog(E_SQLERROR,er.ErrorMsg,1);// 日志处理
}
finally
{
PMConnection.Close();
}
}cnming老大,如果你对我这种写法有什么建议,请尽管提出来,非常高兴认识你。我要关闭数据库连接往往发生在最最普通的地方,也是你意想不到的地方,听你这么一说,我倒觉得确实是我的程序写的有问题。老大能不能给一个简历全局数据库连接的例子呢?谢谢!
{
public static System.Data.SqlClient.SqlConnection PMConnection = null;
}调用时使用ClassSQLServerWrapper.PMConnection 即可获得这个连接,无论你在哪里打开这个连接全局都通用我认为数据库连接无须每次更换,除非你有不同的数据库用户,而且每一个数据库用户有不同的权限,如果是这样,你就需要建立不同的连接
还有,我觉得并发的问题仍然没有得到解决。今天晚上或者明天我会改写那个测试的自动机,争取模拟程序在数据发生碰撞时的数据库状态。
你肯定是用了悲观一致性
Form1.panel1.DrawColor = 3;// 个性化状态栏--颜色
Form1.panel1.Text = "Successfully!"; // 个性化状态栏--文字
this.Close();//??关闭窗口,那finally还执行吗?
1,如果不是3层架够(即普通的c/s)如果使用连接后不关闭连接,这样对减轻server负担用处不大,同时对网络资源和客户端资源会有一定量的消耗!
2,采用三曾架够,单独开发客户端程序中存取数据等操作剔除了连接数据库等繁杂的工作,对于中间业务逻辑层来说,不会有这种暴力测试的处理过程:for (int i=0; i < 20000;i++)
{
数据库连接请求
事物处理语句块
完成后,关闭数据库连接
}存在,最多会这样:数据库连接请求
事物处理开启
for (int i=0; i < 需要发送的sql语句列表,不一定会连续执行某一客户端要求改变的所有语句,可能插入别的客户端提交的sql语句;i++)
{
执行
}
提交事物
关闭数据库连接,可不关闭
Form1.panel1.Text = "Successfully!"; // 个性化状态栏--文字
this.Close();//??关闭窗口,那finally还执行吗?finally肯定要执行的
--------------------------------------------------
Form1.panel1.DrawColor = 3;// 个性化状态栏--颜色
--------------------------------------------------
我这里怎么没有这个属性啊?
1.我提些不相干的建议只是希望你能有好的编码规范,因为习惯是平时养成的.你测试时也可以暂时注释掉不相关的代码,这样越有对比性,也越易找到问题所在(恕我多言:));
2.关于ExcuteDataReader()和ExcuteXmlReader()之类的是因为它们都不能以连接自动关闭方式执行,所以最容易出现交叉使用连接的情况,这样会引发错误.要在程序中保证一个连接在做完一件事前不做另一件事是很难的.简单示例:
//connection为已打开的连接
SqlDataReader reader=connection.ExcuteDataReader();
connection.ExcuteNonQuery();//在DataReader关闭前执行该方法将引起错误.
reader.Close();
所以我建议做一个数据访问层或干脆像O/R Mapping,将具体的数据库存取细节封装起来.
3.我也在想你这种测试究竟是不是合理,因为我没有软件测试经验,所以不敢妄下评论.你测出来的结果是20台机器一台一台执行,不会交叉,那是不是涉及到计算机之间的通信及操作系统及Sql Server的问题而不会是你这里的代码问题.
我也希望知道结果:)
for (int i=0; i < 20000;i++)
{
数据库连接请求
事物处理语句块
完成后,关闭数据库连接
}
且不说50个客户,5000个客户也达不到这种速度吧。
我认为你的测试方式有问题。
访问数据库我觉得这本书可以翻翻<<数据访问模式>>.
测试内容:用户连续执行20000次完整一次插入操作。看看是否有编码错误。同时测试所写的代码能否支持50人同时做插入操作的情况。
测试过程:有50台计算机(P4 2.4G 256MB)同时执行一个含有完整插入操作程序的循环,不断的向数据库添加数据。我个人认为:某个用户点击按钮一次完成插入操作,那么如果让机器自己做只要做一个循环就可以了。50个用户的插入操作就是由50台装有这种程序的机器自动执行。
测试问题:目前是20台上线测试,前5台机器还能构获得响应,但是只有第一台机器能够执行插入操作。我觉得这个问题可能出在我在一次插入操作完成后并没有停止,而是立刻产生第二次插入操作,所以别的机器只能请求服务器响应,但是服务器无能为力提供服务。To Everyone: 希望大家加入一起讨论!我今天还会在做一个插入操作的版本。
数据库连接请求
for (int i=0; i < 20000;i++)
{
事物处理语句块
}
完成后,关闭数据库连接,因此针对单用户来说,不存在这么快速频繁地打开和关闭数据库连接
还有,我认为这个问题已经没有什么可以再探讨的了。