【发布时间】:2011-03-25 22:38:44
【问题描述】:
我有一个 ASP.Net 网站,其中的数据来自 ISeries。 与 ISeries 的数据连接非常慢,速度对于这个网站非常重要。由于从 ISeries 检索数据的速度很慢,我希望尽可能少地建立数据库连接。 所以,我正在考虑从数据库中存储表,这些表在我的网站中很少作为静态属性更改。每当用户登录时,我都会提交一个线程来刷新静态属性中的数据。 这种方法正确吗?如果不是,这种方法有什么问题,有哪些可能的替代方案?
例子:-
对于端口列表,我在用户登录时提交以下线程:-
// Get Ports list
Thread threadPorts = new Thread(delegate()
{
Ports.getPortList();
});
threadPorts.Start();
Session["threadPorts"] = threadPorts;
在 Ports 类中,有 2 种方法 - 一种用于填充静态属性 PortList, 另一个检查线程是否处于活动状态并等待线程完成并在完成后检索端口列表。第二种方法是我在需要端口列表(填充下拉列表等)时在应用程序中使用的方法。
public static void getPortList()
{
DataTable dt = new DataTable();
DB2Connection conn = new DB2Connection(ConfigurationManager.ConnectionStrings["db2IBM"].ConnectionString);
conn.Open();
string query = query to get ports from ISeries;
DB2Command cmd = new DB2Command(query, conn);
cmd.CommandType = CommandType.Text;
DB2DataAdapter adp = new DB2DataAdapter(cmd);
adp.Fill(dt);
cmd.Dispose();
conn.Close();
List<Port> list = new List<Port>();
foreach (DataRow row in dt.Rows)
{
list.Add(new Port(row[0].ToString(), row[1].ToString(), row[2].ToString(), row[3].ToString()));
}
StaticProp.PortList = list;
}
public static List<Port> getPortListfromSession()
{
List<Port> portList = new List<Port>();
if (System.Web.HttpContext.Current.Session["threadPorts"] != null)
{
Thread t = (Thread)System.Web.HttpContext.Current.Session["threadPorts"];
if (t != null)
{
if (t.IsAlive)
{
t.Join();
}
}
}
if (System.Web.HttpContext.Current.Session["threadPorts"] != null)
System.Web.HttpContext.Current.Session.Remove("threadPorts");
portList = StaticProp.PortList;
return portList;
}
【问题讨论】:
-
那么您为什么不能每月花费 5 美元从某个托管服务提供商处获得 SQL Server 数据库?
-
数据库对业务至关重要,它必须在 As400 (ISeries) 上,不幸的是我无法将它移动到其他任何地方。我使用的方法有问题吗?与我的问题相关的文件只是数据库中大量文件中的一小部分。
-
好吧,您在问题中说数据库服务器的速度很慢,但速度很重要。然后你谈到将数据访问层与业务层合并。我个人认为这不是一个好主意,但如果你别无选择,那就是它。
标签: asp.net multithreading static