存储在Session中的ASP.NET,线程和连接字符串

时间:2016-09-15 08:24:07

标签: asp.net multithreading session connection-string

我的应用程序可以连接多个数据库(每个数据库都有相同的模式),我使用静态属性存储当前用户选择的数据库,在Session和encapsule访问中使用静态属性:

public class DataBase
{
    public static string CurrentDB
    {
        get
        {
            return HttpContext.Current.Session["CurrentDB"].ToString();
        }
        set
        {
            HttpContext.Current.Session["CurrentDB"] = value;
        }
    }
}

其他代码访问静态CurrentDB以确定使用什么数据库。

某些操作在线程中启动后台进程,需要访问CurrentDB来执行某些操作。我在考虑使用这样的东西:

[ThreadStatic]
private static string _threadSafeCurrentDB;

public static string CurrentDB
{
    get
    {
        if (HttpContext.Current == null)
            return _threadSafeCurrentDB;
        return HttpContext.Current.Session["CurrentDB"].ToString();
    }
    set
    {
        if (HttpContext.Current == null)
            _threadSafeCurrentDB = value;
        else
            HttpContext.Current.Session["CurrentDB"] = value;
    }
}

然后启动线程:

public class MyThread
{
    private string _currentDB;
    private thread _thread;

    public MyThread (string currentDB)
    {
        _currentDB = currentDB;
        _thread = new Thread(DoWork);
    }

    public DoWork ()
    {
        DataBase.CurrentDB = _currentDB;

        ... //Do the work
    }
}

这是一种不好的做法?

1 个答案:

答案 0 :(得分:0)

实际上,我认为您应该能够确定哪个线程使用哪个数据库,因此我将创建一个继承自class的{​​{1}},但要知道它使用的数据库。它应该有一个Thread方法,因此,如果您需要一个getDB(),它将使用与另一个特定new Thread中使用的数据库相同的数据库,您可以使用它。您也应该能够Thread setDB(db)

在会话中,您使用的是当前数据库方法,该方法假定存在单个当前数据库。如果这个假设描述了真相,那么你可以保持原样,并在每当使用新的当前数据库时更新它。如果您必须同时使用多个数据库,那么您可能希望拥有Thread个数据库,其中Dictionary将是数据库,Value将是某种数据库具有sematic含义的代码,您可以使用它来确定在哪里需要哪个实例。