在 ASP .NET中使用 SQL in-memory table

by adonisy 23. 一月 2018 11:06

.DB World國際中文電子雜誌 
作 者:楊先民 
審 稿:張智凱 

前言

 在這篇文章中,將會介紹如果你想使用 SQL Server自2014之後的新功能:In-memory table,搭配 asp .net的使用方法介紹。

In-Memory table的使用時機

如果你說的是 SQL Server 2014的 in-memory的話,其實它的適用時機不多,因為它本身有很多限制,可能一百個資料表只有一個可以設定也說不定,因為光是不能用 FK這一點,我想大多數的資料表都會被打槍了。

然而,還是有一個時機點可以在 SQL Server 2014的時後使用這個技術,也就是用來存放 ASP .NET的狀態資訊,也就是 session state。

大家都知道,網站程式是沒有所謂的「狀態」的,也就是使用者連到第一個網頁,再連到第二個網頁,網站就不認得你是誰了,更不用說如果你是用 load banlance的話,有多台伺服器做所謂的負載平衡,那更是需要記錄你的 session狀態,而這個 session狀態就可以交給 in-memory table來達成。

不過要怎麼做呢?

首先,要先了解有三個 state的狀態資訊,分別是:

InProcSessionStateStore:儲存 ASP .NET的 worker process的 session state

OutOfProcSessionStateStore:儲存外部 state server process的 session state

SqlSessionStateStore:在 SQL Server資料表中存放 session state

本篇文章主要把重點放在 SqlSessionStateStore,如何將 session state利用 SQL Server的 in-memory table來存放。

主要有兩種方式,一種是新的用法,另一種是舊的用法,新的用法是使用最新的 ASP .NET async 版本的 SQL Server Session State provider(這是比較建議的作法),或是使用早期的 ASP .NET session state provder的方式來做。

第一種方式:ASP .NET async版本的 SQL Server Session State

使用微軟所推出的 ASP .NET async版本的 SQL Server Session State是目前最適當的方式。目前這個版本可以支援 in-memory或是一般資料表的儲存。

步驟一:你需要從 Nuget下載最新的 Microsoft ASP.NET Async SqlSessionState Provider,要注意的是你的 web 專案需要是 .net framework 4.6.2以上的版本才行。

步驟二:打開 web專案的 web.config,然後增加一些屬性在 SqlSessionStateProviderAsync element中,讓 In-Memory OLTP可以啟動,並且調整其時間和間隔(毫秒)。

• UseInMemoryTable: 設定為 true,就是使用 In-Memory OLTP,不然是使用磁碟的資料表。
• MaxRetryNumber: 最大重試次數,若是0則是關閉重試。

• RetryInterval: 時間為毫秒,代表重試的間隔。

除了這三個屬性需要加之外,連線字串的名字要和你使用的連線字串 connectionStringName 屬性的要相同才行。

<connectionStrings>

<add name ="test">

.

.

.

<add name = "SqlSessionStateProviderAsync" connectionStringName="test"

UseInMemoryTable="true"

MaxRetryNumber="5"

RetryInterval="100"....

若是這三個屬性沒有設定的話,則還是使用傳統的磁碟式資料表來儲存。

對於重試的次數與重試間隔,In-memory的預設設定為 10與1

而磁碟式資料表則是預設為 10與1000。

第二種方式:ASP .NET session state provider

若是你尚未使用最新的 ASP .NET async版本的 SQL Server Session State的方式,那你可以用較早之前的 ASP.NET Session State provider使用 In-Memory OLTP。

以下是它的設定步驟:

步驟1:下載並且執行最新的 SQL Server In-Memory OLTP scripts aspstate_sql2016 (no retry logic) 或是 aspstate_sql2016 (with retry logic) 。這些 scripts是基於你的 SQL Server的 In-Memory OLTP for ASP.NET而修改的 script。

你主要的選擇有下面兩個

1.是否需要重試的機制

2.是否要留存資料,還是只要 schema就好,如果只要 schema的話,則 SQL Server若是重啟的話,記憶體中的資料內容將會被清空。

步驟2:設定 web project的 target framework為 .net 4.5或以上的版本。

步驟3:組態 web應用程式,需要透過修改 Web.config的方式達成:

<sessionState mode = "SQLServer" sqlConnectionString="data source=.user id=test;password=PASSWORD"

cookieless="false" timeout = "20">

如果你是使用 SQL Server 2014的 In-Memory table的話,目前看起來似乎也只能把資料表當成一個 session state table,如果是 SQL Server 2016之後的話,那些限制才會被拿掉,才會有更多的記憶體內的用途。

Tags:

SQL Server資料庫 | 楊先民Adonis Young

不允許評論

NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List