网页 静态类sqlHelper多用户访问的问题

比如有两个类和一个sql连接类,内容分别是:类1:classClass1{stringa1=string.Empty;intb1=0;publicvoidtestconn... 比如有两个类和一个sql连接类,内容分别是:
类1:
class Class1
{
string a1 = string.Empty;
int b1 = 0;

public void testconnnew()
{
sqlHelper.open();

sqlHelper.getConnState();

sqlHelper.close();
}

public void testconn()
{
sqlHelper.getConnState();
sqlHelper.close();
}
}
类2
class Class2
{
public void test1()
{
sqlHelper.open();
sqlHelper.getConnState();
Class1 c1 = new Class1();
c1.testconn();
c1.testconnnew();
sqlHelper.getConnState();

}
}
然后sqlHelper类的内容如下:
public class sqlHelper
{
static string connstr = connectionstring;
SqlConnection sqlconn = new SqlConnection(connstr);

public static void open()
{
if (sqlconn.State != ConnectionState.Open)
sqlconn.Open();
}

public static void close()
{
if (sqlconn.State != ConnectionState.Closed)
sqlconn.Close();
}

public static void getConnState()
{
System.Windows.Forms.MessageBox.Show(sqlconn.State.ToString());
}
}
当然这个sqlHelper类在编译的时候会报错。
我想要的功能就是,这是一个网站的后台,当用户1访问这个网站的时候打开一个sql连接进行操作,同时用户2也在访问网站并且也通过这个静态类连接到了sql。。 用户1操作完毕之后,调用close()方法关闭了sql连接。 如果把SqlConnection sqlconn 改成 static SqlConnection sqlconn 那么用户2的sql连接也会被用户1关闭。。
现在有没有什么方法可以让下面这个编译通过,而且用户1和用户2的操作又不会互相干扰。。 谢谢各位大神的指教。
展开
 我来答
youbl
2013-05-17 · TA获得超过2510个赞
知道大有可为答主
回答量:1844
采纳率:62%
帮助的人:1671万
展开全部

首先,不推荐用一个SqlConnection去对应多用户的访问,尤其是可能存在并发时,

你可以在类里这么写:

static SqlConnection GetConnection(string constr)
{
    return new SqlConnection(constr);
}
public static object ExecuteScalar(string sql){
    using(SqlConnection con = GetConnection("xxx")){
        做事
    }
}

不用太担心连接被耗尽的问题,除非你的sql特别慢,或站点访问量极大

要知道我的站点日pv几千万,也是这样的代码

追问
你这种代码我知道。。 但是这样的话是每访问一次就要重新打开一次数据库连接。我现在希望的是这一个用户访问这个网站,在连续使用N次数据库的情况下(某些时刻某网页会同时调用4,5个表中的数据,这样如果用你的代码就要打开4,5次数据库连接。。),尽量争取只打开一次数据库连接。这样可以很大程序的减少数据库的负担。。
追答
是的,对于Sql Server而言,它有维护一个连接池,你前面打开的连接,都会被扔回连接池,供下一次访问进行复用的,所以说,你串行打开4,5次连接,并不会加重数据库负担,

当然如果并发大,还是优化下代码,比如把4,5次访问,改成存储过程一次性返回多个结果集

至于你说的用一个SqlConnection ,要避免问题,只能每次对这个对象加锁,所有数据库访问只能串行,效率极低
Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
playsenlin
2013-05-17 · TA获得超过101个赞
知道小有建树答主
回答量:438
采纳率:0%
帮助的人:240万
展开全部
能否将报的错写出来? 在哪里报的错?

public static void open()
{
if (sqlconn.State != ConnectionState.Open)
sqlconn.Open();
}

public static void close()
{
if (sqlconn.State != ConnectionState.Closed)
sqlconn.Close();
}
在这里 一般不用静态的。 用 构造函数和习构函数。
更多追问追答
追问
因为是网页形式的,所以我并不希望他立刻就打开。。 而是当我使用的时候会由外部程序调用这个方法来打开该数据库连接。。 而等我不用的时候再调用close()方法关闭数据库连接。。 以避免多个用户同时使用一个sql连接导致的锁死现象。。
追答
回答不起了。
我的SQLhelp 目前还没有出现这些问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式