2011-12-23 103 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