我的设置为MySql.Data.MySqlClient v6.9.8.0
和Microsoft.Practices.EnterpriseLibrary.Data v6.0.0
。
该程序是一个长期运行的程序,它持续监听任务,然后通过某种形式的数据库操作执行作业(取决于请求的内容。)有时请求将是一个接一个,有时会有他们之间有几个小时。
我尝试在连接字符串中使用Pooling=true
,但它会导致很多问题(并非所有时间 - 这些都是间歇性问题。)
以下是一个例子:
[MySqlException (0x80004005): Authentication to host 'localhost' for user 'root' using method 'mysql_native_password' failed with message: Reading from the stream has failed.]
关闭pooling
可以解决问题,但同时会使查询变慢,因为我们无法重用连接。我在网上搜索过,很多人都有同样的问题,我发现的唯一修复/解决方法是Pooling=false
,如果可能,我宁愿避免。
以下是我的查询代码示例:
Database db = this.GetDatabase(databaseName);
List<dynamic> results = new List<dynamic>();
// Run the sql query
using (DbCommand dbCommand = db.GetSqlStringCommand(query))
{
foreach (var parameter in inParameters)
{
db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}
foreach (var parameter in outParameters)
{
db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
IDictionary<string, object> instance;
do
{
// Read each row
while (dataReader.Read())
{
instance = new ExpandoObject() as IDictionary<string, object>;
// Populate the object on the fly with the data
for (int i = 0; i < dataReader.FieldCount; i++)
{
instance.Add(dataReader.GetName(i), dataReader[i]);
}
// Add the object to the results list
results.Add(instance);
}
} while (dataReader.NextResult());
}
return results;
}
有什么想法吗?
答案 0 :(得分:1)
你能试试吗?我知道我知道。使用&#34;使用&#34;应该意味着我不必调用dataReader.Close()方法......但我仍然这样做。我还略微修改了dr.Read块。
这家伙谈论它。
http://www.joseguay.com/uncategorized/ensure-proper-closure-disposal-of-a-datareader
我知道,我知道。你不应该这样做。即使使用Ent库,我也会做一个额外的.Close步骤来尝试确保。
Database db = this.GetDatabase(databaseName);
List<dynamic> results = new List<dynamic>();
// Run the sql query
using (DbCommand dbCommand = db.GetSqlStringCommand(query))
{
foreach (var parameter in inParameters)
{
db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}
foreach (var parameter in outParameters)
{
db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
}
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
IDictionary<string, object> instance;
while (dataReader.Read())
{
instance = new ExpandoObject() as IDictionary<string, object>;
// Populate the object on the fly with the data
for (int i = 0; i < dataReader.FieldCount; i++)
{
instance.Add(dataReader.GetName(i), dataReader[i]);
}
// Add the object to the results list
results.Add(instance);
}
if (dataReader != null)
{
try
{
dataReader.Close();
}
catch { }
}
}
return results;
}