我在静态类中有一个数据读取器,允许我从数据库中获取单个或多个记录。这用于ASP.net应用程序。但是,我们最近遇到了一些奇怪的问题,我想知道我当前的方法结构是否可能是导致问题的原因。有时我会收到一条错误,指出数据阅读器仍处于打开状态。其他时候服务器超时发生。
这是我从数据库中获取数据的一个静态类的示例。为了简洁起见,我将此示例中的方法数量减少到了“get”结构。因此,如果我想返回类型为List的List,我将调用以下格式为aspx.cs文件。
List<Reference> ref = ReferenceAdapter.GetAllByType(......);
非常感谢任何见解。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using DbProvider;
using MyBusinessModelLayer;
namespace MyDataAccessLayer
{
public static class ReferenceAdapter //: IReferenceAdapter
{
static IDbProvider _dbProvider;
static ReferenceAdapter()
{
Initialize();
}
private static void Initialize()
{
_dbProvider = new SqlDbProvider(Config.SqlConnectionString);
}
public static List<Reference> GetAllByType(ReferenceType referenceType)
{
return GetAllByType(referenceType, false);
}
public static List<Reference> GetAllByType(ReferenceType referenceType, bool isIncludeDeleted)
{
Hashtable hIn, hOut;
string sp;
sp = "[ReferenceSelectAllByReferenceType]";
hIn = new Hashtable();
hIn.Add("@ReferenceType", referenceType.ToString());
if (!isIncludeDeleted)
{
hIn.Add("@Deleted", false);
}
hOut = new Hashtable();
hOut.Add("@RTNStatus", 0);
return GetMultipleFromDb(sp, hIn, hOut, CommandType.StoredProcedure);
}
private static List<Reference> GetMultipleFromDb(string sSql, Hashtable hInputParameters)
{
return GetMultipleFromDb(sSql, hInputParameters, new Hashtable(), new CommandType());
}
private static List<Reference> GetMultipleFromDb(string sSql, Hashtable hInputParameters, CommandType cType)
{
return GetMultipleFromDb(sSql, hInputParameters, new Hashtable(), cType);
}
private static List<Reference> GetMultipleFromDb(string sSql, Hashtable hInputParameters, Hashtable hOutputParameters, CommandType cType)
{
IDbCommand dbCommand = _dbProvider.Select(sSql, hInputParameters, hOutputParameters, cType);
var lo = new List<Reference>();
using (IDataReader dr = dbCommand.ExecuteReader())
{
while (dr.Read())
lo.Add(GetObjectFromDataRecord(dr));
}
dbCommand.Connection.Close();
return lo;
}// GetMultipleFromDb()
private static Hashtable GetParametersFromObject(Reference o)
{
Hashtable h = new Hashtable();
h.Add("@ReferenceShortName", o.ShortName);
h.Add("@ReferenceLongName", o.LongName);
h.Add("@ReferenceDescription", o.Description);
h.Add("@ReferenceType", o.Type.ToString());
h.Add("@ReferenceSortKey", o.SortKey);
return h;
}// GetParametersFromObject()
private static Reference GetObjectFromDataRecord(IDataRecord dr)
{
Reference o = new Reference();
o.ReferenceId = dr["ReferenceID"].DBNullToInt();
o.ShortName = dr["ReferenceShortName"].ToString();
o.LongName = dr["ReferenceLongName"].ToString();
o.Description = dr["ReferenceDescription"].ToString();
o.Type = (ReferenceType)Enum.Parse(typeof(ReferenceType), dr["ReferenceType"].ToString(), true);
o.SortKey = dr["ReferenceSortKey"].DBNullToInt();
o.Created = dr["CreatedDate"].DBNullToDateMinVal();
o.CreatedBy = dr["CreatedBy"].DBNullToInt();
o.Updated = dr["UpdatedDate"].DBNullToDateMinVal();
o.UpdatedBy = dr["UpdatedBy"].DBNullToInt();
o.Deleted = Convert.ToBoolean(dr["Deleted"]);
o.Deletable = GetAssetReferenceCount(o.Type, o.ReferenceId);
return o;
}// GetObjectFromDataRecord()
}
}
答案 0 :(得分:1)
重写您的代码,以便没有静态的共享对象。最有可能的是,随着您的站点被越来越多的用户使用,您的静态方法会重用静态资源,从而导致并发问题。
而不是
List<Reference> ref = ReferenceAdapter.GetAllByType(......);
你可以
using ( var adapter = new ReferenceAdapter() )
{
List<Reference> ref = adapter.GetAllByType();
}
这不仅会创建一个新实例,因此不存在并发问题,而且还可以确保资源正确处理。
您确定通过编写自己的数据访问层来重塑事物是一种正确的方法吗?考虑到您缺乏经验,使用现有框架(如orm或micro-orm)听起来更安全。人们在类似的问题上吃了很多东西,比你早几年,他们通过设计现成的图书馆来分享经验。