我的应用程序可以连接多个数据库(每个数据库都有相同的模式),我使用静态属性存储当前用户选择的数据库,在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
}
}
这是一种不好的做法?
答案 0 :(得分:0)
实际上,我认为您应该能够确定哪个线程使用哪个数据库,因此我将创建一个继承自class
的{{1}},但要知道它使用的数据库。它应该有一个Thread
方法,因此,如果您需要一个getDB()
,它将使用与另一个特定new Thread
中使用的数据库相同的数据库,您可以使用它。您也应该能够Thread
setDB(db)
。
在会话中,您使用的是当前数据库方法,该方法假定存在单个当前数据库。如果这个假设描述了真相,那么你可以保持原样,并在每当使用新的当前数据库时更新它。如果您必须同时使用多个数据库,那么您可能希望拥有Thread
个数据库,其中Dictionary
将是数据库,Value
将是某种数据库具有sematic含义的代码,您可以使用它来确定在哪里需要哪个实例。