在操做数据库的过程当中,必然要产生数据库链接,这就要求在使用的时候要及时关闭链接。以免数据库会话过多的问题。 数据库
以Oracle数据库为例: session
Oracle数据库查看会话,进程的语句 并发
--查询数据库当前进程的链接数 spa
select count(*) from v$process; 3d
--查看数据库当前会话的链接数 orm
select count(*) from v$session; 对象
--查看数据库的并发链接数 blog
select count(*) from v$session where status='ACTIVE'; 进程
--查看当前数据库创建的会话状况 内存
select sid,serial#,username,program,machine,status from v$session;
--查询数据库容许的最大链接数
select * from v$parameter where name = 'processes';
执行一个查询,可是不关闭
private void Query()
{
OracleConnection conn = null;
try
{
conn = OpenConn();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM HY_USERS where USER_NO = '072779'";
cmd.CommandType = CommandType.Text;
var reader = cmd.ExecuteReader();
while (reader.Read())
{
AddInfo(string.Format("USER_NO:{0},USER_NAME:{1}", reader["USER_NO"], reader["USER_NAME"]));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
//CloseConn(conn);
}
}
咱们看到产生一个会话
执行屡次就会参数多个会话:
咱们都知道数据库会话数有大小限制,在会话过多会致使数据库没法链接,因此在操做完毕数据库必定要关闭链接。
咱们看看关闭链接后的代码执行的效果
private void QueryClose()
{
OracleConnection conn = null;
try
{
conn = OpenConn();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM HY_USERS where USER_NO = '072779'";
cmd.CommandType = CommandType.Text;
var reader = cmd.ExecuteReader();
while (reader.Read())
{
AddInfo(string.Format("USER_NO:{0},USER_NAME:{1}", reader["USER_NO"], reader["USER_NAME"]));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
CloseConn(conn);
}
}
无论执行多少次,都不会有过多的会话
在DataReader的读取过程当中,会一直占用OracleConnection链接对象,不能将数据库链接关闭。这个一个须要注意的问题,因此当项目中大量使用DataReader来读取数据,若是做为团队开发,或者有新成员参与进来,没有注意到数据库链接关闭,那么可能出现占用会话的问题,最终甚至致使数据库崩溃;因此在使用DataReader须要慎重。
不过DataReader的读取效率要高,占用内存必DataSet要少。