我一直在使用相当庞大的数据库。我想在pageload事件期间填充页面的webcontrols(下拉列表),以便为网页提供尽可能多的灵活性。例如,我有一个用户可以选择的下拉列表,它将从数据表的特定列的唯一行中填充。
现在,我不希望每次页面加载时都发出oracle查询,因为这会显着减慢网页速度(每次大约1分钟)。所以我开始将cookie视为解决方案。我很快发现cookie大小(4kb)的限制对我来说太小了。如果我真的想在本地存储数据行,我将需要大约10-15kb的大小!所以我试图搜索是否有任何方法来增加cookie大小限制以满足我的需求,我发现可能的解决方案是localstorage。
详细信息:我正在使用C#/ ASP.NET + ORACLE
答案 0 :(得分:3)
以下是ASP.Net中所有状态信息的存储选项 -
现在,我不希望每次页面加载时都触发oracle查询 因为这会显着减慢网页速度(大约1分钟 每次)。
你有两种选择 -
理想情况下,您不希望存储在 ViewState 中,除非您配置为在Sql Server中存储ViewState(这超出了此问题的范围),否则它将使您的页面非常繁重的
localStorage - 并非所有浏览器都可以处理localStorage,因此请务必先检查它。
<script type="text/javascript">
if(window.localStorage) {
window.localStorage.SetItem('keyName','valueToUse');
// OR
window.localStorage.keyName = 'valueToUse';
}
</script>
仅供参考: ASP.NET不提供处理本地存储的特定方法;你只能通过javascript在客户端进行操作。
答案 1 :(得分:0)
您不想使用Cookie。
我在我一直在努力的应用程序中有类似的要求。我需要让用户使用自动完成输入框从~15,000个选项中选择一个值。每次组件需要查找值时,我都不想访问数据库。我决定使用会话存储来存储所有可能的值,然后将这些值提供给自动完成组件。它很棒。您也可以使用本地存储。
根据我的需要,会话存储是一个更好的选择,因为我不需要在用户关闭浏览器选项卡后保持值。此外,在我将15,000个项目存储在会话存储中之前,我使用JavaScript压缩来压缩它们以节省空间。我正在使用lz-string进行压缩。
答案 2 :(得分:0)
您不希望为此目的使用Cookie。不仅有大小限制,而且每次向服务器发出请求时都会来回发送cookie,这可能会降低应用程序的响应速度,具体取决于您的服务器和用户的带宽。
另一种方法是使用Viewstate
将数据存储在页面本身上。这没有空间限制,但它确实与增加请求大小的cookie有相同的问题。
您还可以使用Session
将每个会话的数据存储在服务器的内存中。这降低了带宽要求,但确实占用了服务器本身的额外内存空间,这可能并不理想。内存中的大量数据+大量会话可能会导致内存不足。
因此,弄清楚你的特定权衡是什么。 Viewstate
与您当前的解决方案最相似。
要访问您网页中的视图状态或会话,只需执行Viewstate['KEY']
或Session['KEY']
需要注意的另一件事是,Session
数据会在整个会话期间以及跨页面加载/重定向/等等时保留。 Viewstate
仅适用于该页面。如果您转到另一个页面,Viewstate
将被丢弃。
如果所有用户的数据都相同,那么您还可以使用Cache
,它将数据存储在应用程序级别而不是会话级别。这仍占用服务器上的内存空间,但不会随着会话的增加而增加(在你的情况下仅为15k!)。您还可以指定缓存的过期时间(滑动或绝对),如果在一定时间内未访问该资源,则可以自动释放正在使用的内存。在使用之前,请确保始终检查数据是否在缓存中,因为如果信息过期,.NET将丢弃该信息,或者只是为了其他目的而需要清理内存。