2013-09-05 13 views
0

我有一个静态类中的数据读取器,它允许我从数据库中获取一条或多条记录。这在一个ASP.net应用程序中使用。然而,最近我们遇到了一些奇怪的问题,我想知道我目前的方法结构是否可能是问题的原因。有时我收到一个错误,指出数据读取器仍然处于打开状态。其他时间发生服务器超时。正确的.net数据搜索器设置建议

这是我从数据库中获取数据的静态类之一。为了简洁起见,我将这个例子中的方法数量减少到了我的“get”结构。所以如果我想返回一个类型为Reference的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() 
} 

},以便有没有静态,共享对象

+2

'SqlDbProvider'线程的成员是否安全? – Magnus

+0

@Magnus几乎肯定不是。 – Servy

回答

1

重写代码。很可能,随着越来越多的用户使用您的网站,您的静态方法会重复使用静态资源,导致并发问题。

而不是

List<Reference> ref = ReferenceAdapter.GetAllByType(......); 

你可以有

using (var adapter = new ReferenceAdapter()) 
{ 
    List<Reference> ref = adapter.GetAllByType(); 
} 

不仅如此,有没有并发问题,将创建一个新的实例,而且你可以确保资源得到妥善处理。

您确定通过编写自己的数据访问层重新创建事物是一种正确的方法吗?考虑到你缺乏经验,使用现有的框架(如orm或微型orm)听起来更安全。人们在类似的问题上吃了苦头,并且比你早几年,他们通过设计现成的图书馆来分享经验。