访问数据库须要注意的问题 c#

在操做数据库的过程当中,必然要产生数据库链接,这就要求在使用的时候要及时关闭链接。以免数据库会话过多的问题。 数据库

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和DataSet的一些问题

在DataReader的读取过程当中,会一直占用OracleConnection链接对象,不能将数据库链接关闭。这个一个须要注意的问题,因此当项目中大量使用DataReader来读取数据,若是做为团队开发,或者有新成员参与进来,没有注意到数据库链接关闭,那么可能出现占用会话的问题,最终甚至致使数据库崩溃;因此在使用DataReader须要慎重。

不过DataReader的读取效率要高,占用内存必DataSet要少。

相关文章
相关标签/搜索