在操做數據庫的過程當中,必然要產生數據庫鏈接,這就要求在使用的時候要及時關閉鏈接。以免數據庫會話過多的問題。 數據庫
以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要少。