3

我在一个网站上工作,我想要一个下拉菜单来显示城市列表。我应该在哪里存储城市列表以便更快地访问?我不想将此数据存储在数据库中。

将它存储在 XML 文件中是个好主意吗?

4

6 回答 6

3

我会将它存储在缓存中,可能带有 Sql 依赖或文件依赖。

public DataTable GetCities(bool BypassCache)
{
   string cacheKey = "CitiesDataTable";
   object cacheItem = Cache[cacheKey] as DataTable;
   if((BypassCache) || (cacheItem == null))
   {
      cacheItem = GetCitiesFromDataSource();
      Cache.Insert(cacheKey, cacheItem, null,
      DateTime.Now.AddSeconds(GetCacheSecondsFromConfig(cacheKey), 
      TimeSpan.Zero);
   }
   return (DataTable)cacheItem;
}

如果您想将它存储在 XML 中,那也可以,但是每次发生更改时,您都必须将文件发布到场中的所有服务器。

于 2012-05-27T11:42:38.207 回答
1

将其存储在文本文件中。这避免了 XML 解析的开销。加载使用File.ReadAllLines().

于 2012-05-27T11:41:11.177 回答
0

您可以将列表存储为 XML 文件或其他平面文件格式,但我想这取决于您不想将其存储在数据库中的原因。

您提到了更快的访问,但您可能想对此进行阐述。如果您的意思是您不希望每次请求都访问数据库的开销,那么您是否考虑过将其存储在数据库中并在应用程序启动时缓存列表?这样,您可以获得数据库的好处,但只需支付一次开销。

然而,对于小型应用程序,XML 文件就可以了。

于 2012-05-27T11:39:23.980 回答
0

如果列表永远不会改变,那么只需在代码中将其声明为 const 字符串数组。

如果它偶尔会发生变化,那么把它放在一个xml文件或数据库表中,但是当你读取它时缓存它,这样它只需要在任何会话中读取一次。

于 2012-05-27T11:40:23.283 回答
0

我相信 XML 是最好的解决方案,使用 DOM 解析器而不是 SAX 会更好。

您也可以在未加载文件时将文件加载到会话中以减少读取 XML 的次数,但这会在服务器上使用更多 RAM,请确保不要加载不必要的数据,因为它将被加载到服务器的 RAM 中对于每个会话。如果有意义,您可以仅为登录用户加载它。

于 2012-05-27T11:40:44.420 回答
-1

我要建议的是 HORID 风格,但我认为你能得到的最快和最小的“足迹”:

public static readonly string [] CityList = new string [] 
{
  "Sydney",
  "New York",
  "London"
};

现在,我希望您不喜欢这个解决方案,并且可以给我们更多的背景信息,以便我们能够为您的问题提供一个优雅且可维护的解决方案;但如果你追求的只是速度......

于 2012-05-27T11:40:43.067 回答