2011-12-23 102 views
0

我重建已經在過去的五年中開發了一套系統,最初開始與傳統的ASP,我現在正在把整個事情ASP.NET(使用VB.NET)關閉/ MySQL的池ODBC連接

的系統一直困擾着數據連接打開太多的問題,導致週期性的「max_connections is exceeeded」錯誤。

在問我的服務器主機很多次了,我仍然有麻煩,所以認爲我會打開它。

我目前打開連接如下:

Dim sql = "SQL SELECT" 
Dim oConnection As OdbcConnection = New OdbcConnection(ConfigurationManager.ConnectionStrings("dbConn").ConnectionString) 
oConnection.Open() 
openDatabase = New OdbcCommand(sql, oConnection) 

連接字符串包含與web.config文件,看起來像這樣

<add name="dbConn" connectionString="DRIVER={MySQL ODBC 3.51 Driver}; SERVER=mysql.dc-servers.com; DATABASE=dbName; UID=user; PASSWORD=pwd; OPTION=3; pooled=true" providerName="System.Data.Odbc"/> 

我使用像一個DataReader得到實際數據這個:

Dim objDataReader As OdbcDataReader 
objDataReader = openDatabase.ExecuteReader(CommandBehavior.CloseConnection) 

While (objDataReader.Read()) 
     // do stuff 
End While 

objDataReader.Close() 

這是我的理解,假設沒有數據或數據庫的錯誤(CommandBehavior.CloseConnection)應確保當線objDataReader.Close()關閉閱讀器時,它應該也關閉連接(或將其返回到池)

雖然我收到了這些max_connections錯誤。

看着MySQL管理員打開的進程,我可以看到連接沒有被關閉。

我對連接過程瞭解甚少,而且對MySQL服務器的訪問非常有限,所以很難找出這裏發生的事情......當然......除非我誤解了某些東西,而我希望是這樣,你們可以指點我吧!

回答

0

我不知道很多關於DataReader,但似乎你需要找到這個泄漏。我會建議首先手動設置您的連接字符串中的池大小使用:最大和最小池大小屬性詳見:http://dev.mysql.com/doc/refman/5.0/en/connector-net-connection-options.html

我也建議監測打開和關閉連接池設置爲關閉連接生命週期實際發生了什麼。你可以在MySQL控制檯

show processlist; 

用於查看當前連接和

show global status; 

監控所有的數據庫屬性。我也建議從MySQL的解釋「太多的連接問題」

http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

確保MySQL配置是與你的應用程序配置線,以確保你不允許超過太多連接看完這篇文章服務器實際允許。

乾杯,

+0

感謝您的提示。雖然設置最大/最小池大小沒有任何差別。我正在使用MySQL PHP管理員來查看我可以使用的連接,而流程列表並不提供有關連接正在進行的信息,或者爲什麼它們處於打開狀態,因此很難分辨哪些「開放數據庫」事件導致它。我想我應該手動關閉所有連接並放棄使用'(CommandBehavior.CloseConnection)',我認爲這應該爲我做! – 2011-12-23 18:27:34

+0

您是否嘗試過在關閉了池的情況下執行單個操作,以查看該操作使用的連接是否已關閉?就我個人而言,我總是密切關注我的聯繫以避免這些問題。確保關閉池來執行此測試,因爲池永遠不會真正關閉連接,它只會爲下一個事務保存連接。 – Stainedart 2011-12-23 18:56:03

+0

葉,最初當我開始測試游泳池時,我只是添加了它,看看這是否會有所幫助!似乎沒有做出任何明顯的區別! – 2011-12-23 22:19:52