在asp.net里 oracle被频繁调用连接(打开关闭) 总是把数据库资源耗尽 来者给分

sxfgen 2012-01-10 03:10:59
        
//这是连接
//得到连接方法
public static OracleConnection Connection
{
get
{
string connectionString = ConfigurationSettings.AppSettings["ConnStr2"];
OracleConnection connection = new OracleConnection(connectionString);
if (connection == null)//如果连接是空,创建连接,并打开连接
{
connection = new OracleConnection(connectionString);
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Closed)//如果连接存在,并关闭,打开连接
{
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Broken)//如果上一次连接未关闭,先关闭连接,再打开
{
connection.Close();
connection.Open();
}
return connection;
}
}

//其中一条查询函数
public static int GetScalar(string safeSql)//无参数sql语句
{
OracleCommand cmd = new OracleCommand(safeSql, Connection);
int result = Convert.ToInt32(cmd.ExecuteScalar());
Connection.Close();
Connection.Dispose();
return result;
}



但是当频繁打开关闭查询数据时 数据库承受不住,还得要重启IIS ,兄弟姐妹们,有人知道是什么问题吗。谢谢了。

...全文
461 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanxin_1999 2012-01-12
  • 打赏
  • 举报
回复
使用using比较好
dongt1 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 charles_y 的回复:]

不对,本来就不应该有connection 这个属性。
connection 在用的时候建立

using (OracleConnection connection = new OracleConnection(connectionString))
{
里面是你对数据库处理的语句了,比如写定义sql语句,打开连接,执行sql语句,关闭连接
}

看看一些sqlhelper的代码吧,……
[/Quote]++这个可以吗???
sxfgen 2012-01-12
  • 打赏
  • 举报
回复
谢谢 各位 现在结贴。
我用的是using()
不过封装成函数 不总是写 using 用封装调用的好方法吗。
还有连接池不会弄 呵呵
总之 谢谢了
zhu_jiang 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiangshun 的回复:]

频繁调用连接
多频繁?并发的有多少?试试数据库连接池
[/Quote]

用连接池把!
玄冰2013 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 soft_lugy 的回复:]

引用 23 楼 jiangshun 的回复:
引用 6 楼 sxfgen 的回复:

一次查询 大约100-200多次



引用 8 楼 sxfgen 的回复:

小弟绝对没有冒犯的意思 我是在 for 循环里写的。


把查询放一个批处理中,一次提交,获得返回值就是了
强烈建议不要在循环中打开数据库


[/Quote]
+1
soft_lugy 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jiangshun 的回复:]
引用 6 楼 sxfgen 的回复:

一次查询 大约100-200多次



引用 8 楼 sxfgen 的回复:

小弟绝对没有冒犯的意思 我是在 for 循环里写的。


把查询放一个批处理中,一次提交,获得返回值就是了
强烈建议不要在循环中打开数据库
[/Quote]
+1
jiangshun 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sxfgen 的回复:]

一次查询 大约100-200多次
[/Quote]

[Quote=引用 8 楼 sxfgen 的回复:]

小弟绝对没有冒犯的意思 我是在 for 循环里写的。
[/Quote]

把查询放一个批处理中,一次提交,获得返回值就是了
强烈建议不要在循环中打开数据库


sxfgen 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 atm_rmb 的回复:]
数据库打开关闭太频繁,再怎么释放资源数据库也撑不住啊,建议将数据一次性读取到DataSet中,将要更改或插入的数据库在DataSet中更新,最后一次性更新到数据库中。
[/Quote]

没这样做过,如果一次性读取到DataSet中 ,是放到内存中了吗,别的用户可以调用这个dataset 吗。
操作上是怎样一个思路呀(读数据,修改数据)。
希望指点(有参考的网站吗)
ATM_RMB 2012-01-10
  • 打赏
  • 举报
回复
数据库打开关闭太频繁,再怎么释放资源数据库也撑不住啊,建议将数据一次性读取到DataSet中,将要更改或插入的数据库在DataSet中更新,最后一次性更新到数据库中。
charles_y 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sxfgen 的回复:]
C# code

public static int GetScalar(string safeSql)//无参数sql语句
{
using (OracleConnection conn = new OracleConnection(connstr))
{
conn.Open……
[/Quote]
可以的
sxfgen 2012-01-10
  • 打赏
  • 举报
回复

public static int GetScalar(string safeSql)//无参数sql语句
{
using (OracleConnection conn = new OracleConnection(connstr))
{
conn.Open();
OracleCommand cmd = new OracleCommand(safeSql, conn);
int result = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();
return result;
}
}

改成这样 行吗。
charles_y 2012-01-10
  • 打赏
  • 举报
回复
不对,本来就不应该有connection 这个属性。
connection 在用的时候建立

using (OracleConnection connection = new OracleConnection(connectionString))
{
里面是你对数据库处理的语句了,比如写定义sql语句,打开连接,执行sql语句,关闭连接
}

看看一些sqlhelper的代码吧,微软自己就有一个sqlhelper,在petshop这个例子中

sxfgen 2012-01-10
  • 打赏
  • 举报
回复


private static OracleConnection connection;

public static OracleConnection Connection
{
get
{
string connectionString = ConfigurationSettings.AppSettings["ConnStr2"];
using (OracleConnection connection = new OracleConnection(connectionString))
{
if (connection.State == System.Data.ConnectionState.Closed)//如果连接存在,并关闭,打开连接
{
connection.Open();
}
if (connection.State == System.Data.ConnectionState.Broken)//如果上一次连接未关闭,先关闭连接,再打开
{
connection.Close();
connection.Open();
}
return connection;
}

}
}





返回 connection 这么写对吗
charles_y 2012-01-10
  • 打赏
  • 举报
回复
连接池是ado.net 自己维护的,你不需要操心。

数据库连接串中可以定义连接池的大小,如min pool size=1;max pool size=100

你的那个public static OracleConnection Connection连接方法问题很大,根本不应该这么写的。一开始就把连接打开,遇到稍微复杂点的处理很容易出问题。

正确的做法是类似这样的

public static connectionString{get;set;}

using using(OracleConnection con=new OracleConnection(connectionString))
{

你的代码
}
sxfgen 2012-01-10
  • 打赏
  • 举报
回复
呵呵 我不会这么写,一会百度查查, 有实例吗。
wulei1092 2012-01-10
  • 打赏
  • 举报
回复
你可以用Linq查询,一次查出所有数据封装在List<Class>集合中,然后在集合的基础上调用Linq方法,或者用EDM岂不是很简单
sxfgen 2012-01-10
  • 打赏
  • 举报
回复
哦 谢谢 有人知道数据库连接池 怎么写吗 (是怎么实现的呀)
风2013 2012-01-10
  • 打赏
  • 举报
回复
using(){} 用这个应该可以解决你的问题,速度上不清楚,至少你不需要老是重启iis
sxfgen 2012-01-10
  • 打赏
  • 举报
回复
那么写的这些

//其中一条查询函数
public static int GetScalar(string safeSql)//无参数sql语句
{
OracleCommand cmd = new OracleCommand(safeSql, Connection);
int result = Convert.ToInt32(cmd.ExecuteScalar());
Connection.Close();
Connection.Dispose();
return result;
}

就没有用了 是吗

using()对频繁查询连接 好使吗, 不过我改成过Using 试过,不是很见效。


打开 关闭
//如果连接存在,并关闭,打开连接

//如果上一次连接未关闭,先关闭连接,再打开
上面注释着呢 这么写是不是 又问题呀??
charles_y 2012-01-10
  • 打赏
  • 举报
回复
遵循一个原则,最晚open,最早关闭。

Connection 不是托管资源,所以用的时候使用using

using(OracleConnection xxsx=connecti..)
{

你的代码
}
加载更多回复(10)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧