成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么要關閉數據庫連接,能不能不要啊

數據庫
對于某些只有幾個人使用的應用程序,可以不關閉數據庫連接,但是在寫代碼的時候最好要加上連接是否打開的判斷。

首先要說明的是連接數是有限制的:

代碼如下:

  1. for (int i = 0; i < 10000; i++) 
  2.     SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; 
  3.                 AttachDbFilename=""E:\DB\NORTHWND.mdf""
  4.                 Integrated Security=True;Connect Timeout=30;User Instance=True"); 
  5.  
  6.     conn.Open(); 
  7.     Console.WriteLine("打開了{0}個連接", i); 

運行結果如下:

過一會就會提示打開連接超時了:

可以看到數據庫連接時有限制的,如果連接不關閉,而且使用的人比較多,那么系統很快就down掉了。

但是有時候由于某些原因應用程序可能只是幾個人使用,所以就有人設計了:

在應用程序啟動的時候打開數據庫連接,在應用程序關閉的時候關閉數據庫連接

那么使用這種方式有什么問題呢?

首先假設有一張表Nums,表定義如下:

Main代碼如下:

  1. SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; 
  2.                     AttachDbFilename=""E:\DB\NORTHWND.mdf""
  3.                     Integrated Security=True;Connect Timeout=30;User Instance=True"); 
  4. conn.Open(); 
  5. Parallel.For(1, 9999, (id) => 
  6.     ExecuteCommand(conn, id); 
  7. }); 

就是從1到9999開始執行ExecuteCommand

ExecuteCommand代碼如下:

  1. private static void ExecuteCommand(SqlConnection conn, int id) 
  2.     Console.WriteLine("正在執行." + id); 
  3.  
  4.     Thread.Sleep(100); 
  5.  
  6.     SqlCommand cmd = new SqlCommand( 
  7.        string.Format("Insert into Nums values('{0}') ", id), conn); 
  8.  
  9.     cmd.ExecuteNonQuery(); 

運行:

 

可以看到ExecuteNonQuery方法拋出了異常,原因是連接處于關閉狀態。

可是我們的連接一直都是open著的啊,并沒有調用close,dispose之類的方法啊

于是在ExecuteCommand前面增加判斷條件:

  1. if (conn.State != System.Data.ConnectionState.Open) 
  2.     conn.Open(); 

再次運行:

可以看到還是會出現連接已關閉的問題。你知道什么原因嗎?

這里是由于多線程環境引起的。所以需要加鎖。

  1. private static object syncObj = new object(); 
  2. private static void ExecuteCommand(SqlConnection conn, int id) 
  3.     lock (syncObj) 
  4.     { 
  5.         if (conn.State != System.Data.ConnectionState.Open) 
  6.             conn.Open(); 
  7.         Console.WriteLine("正在執行.." + id); 
  8.         Thread.Sleep(100); 
  9.         SqlCommand cmd = new SqlCommand( 
  10.            string.Format("Insert into Nums values('{0}') ", id), conn); 
  11.         cmd.ExecuteNonQuery(); 
  12.     } 

再次運行:可以發現基本沒問題了.

修改Parallel.For的***值上限,要測試下是否可以長期執行了。

  1. Parallel.For(1, Int32.MaxValue, (id) => 
  2.             { 
  3.                 ExecuteCommand(conn, id); 
  4.             }); 

一天測試下來,沒出現任何問題。

結論對于某些只有幾個人使用的應用程序,可以不關閉數據庫連接,但是在寫代碼的時候***要加上連接是否打開的判斷。

原文鏈接:http://www.cnblogs.com/LoveJenny/archive/2011/08/09/2131664.html

【編輯推薦】

  1. DataReader鏈接關閉解惑篇
  2. 詳解MySQL如何鏈接遠程SQL
  3. 詳解SQL Server如何鏈接遠程MySQL

 

 

責任編輯:艾婧 來源: LoveJenny的博客 
相關推薦

2024-07-15 11:41:14

2016-05-19 17:10:27

銀行

2024-04-26 09:37:43

國產數據庫開發者

2016-12-15 17:15:44

2017-01-19 14:44:14

2017-01-16 15:01:27

中安威士

2019-11-21 09:25:23

AI 數據人工智能

2010-04-12 16:59:52

Oracle性能診斷

2019-07-29 16:34:44

物聯網網絡技術

2011-12-06 10:06:33

云存儲

2017-12-25 13:26:36

CNN深度學習網絡

2009-12-21 15:43:07

2021-02-26 21:25:08

比特幣投資貨幣

2022-10-20 08:00:37

機器人ZadigChatOps

2020-10-16 18:33:18

Rust語言前端開發

2010-06-01 09:48:43

云計算CIO整合

2019-11-13 08:37:34

數據庫筒倉基礎架構

2025-04-22 08:00:00

2013-04-19 10:42:02

打車軟件大數據

2009-12-11 13:33:36

VS2008技巧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操狠狠搞 | 精品国产一区二区在线 | 综合国产第二页 | 日韩亚洲欧美综合 | 一区免费观看 | 精品国产不卡一区二区三区 | 成人精品一区二区 | 久久久久久免费看 | 超碰在线播 | 91五月天| 国产精久久久久久久妇剪断 | 欧美成年网站 | 久久久久久九九九九 | 一区二区手机在线 | 91精品国产欧美一区二区 | 国产女人与拘做视频免费 | 日韩图区| 99久久精品免费看国产小宝寻花 | 欧美亚洲视频 | 国产美女精品视频 | 午夜精品一区二区三区在线观看 | 午夜网| 91精品国产91久久久久久不卞 | 99re在线视频| 啪视频在线 | 久久精品小视频 | 俺去俺来也www色官网cms | 久久国产亚洲 | 日本不卡免费新一二三区 | 欧美一区二区视频 | 亚洲精品久久久久久久久久久 | 国产成人99久久亚洲综合精品 | 欧美日日 | 久久久久久久久久久蜜桃 | 亚洲人成人一区二区在线观看 | 亚洲二区视频 | 欧美日韩精选 | 国产精品日韩一区二区 | 欧美精品一区二区三区蜜桃视频 | 亚洲视频在线免费观看 | 国产欧美在线播放 |