Нужно ли создавать базу данных состояния сеанса ASP.NET 4.0 SQL, отличную от существующей базы данных ASPState ASP.NET 2.0?

Является ли механизм состояния сеанса ASP.NET 4.0 SQL обратно совместимым с схемой ASP.NET 2.0 для состояния сеанса или должен / должен ли мы создать отдельную отдельную базу данных состояния сеанса для наших приложений ASP.NET 4.0?

В любом случае я склоняюсь к последнему, но база данных 2.0 просто работает, хотя мне интересно, существуют ли существенные различия между схемой / процедурами базы данных ASPState между версиями ASP.NET 2.0 и 4.0. Спасибо.

На это не было никакого быстрого ответа, поэтому я сделал рытье. Я создал ASPState данных ASPState используя инструмент aspnet_regsql.exe из .NET 2.0, а затем сделал то же самое, используя тот же инструмент, но из .NET 4.0. Затем я сгенерировал скрипты из каждой из полученных баз данных SQL Server и использовал инструмент сравнения, чтобы изолировать различия.

Я нашел: Единственное существенное различие между схемой ASPState от версий .NET 2.0 до .NET 4.0 – это хранимая процедура dbo.DeleteExpiredSessions . Это хранимая процедура, вызываемая периодически заданием агента SQL Server, также установленным инструментом.

Следовательно, казалось бы, что схема ASPState 2.0 и ASPState 4.0 отлично совместима, поэтому нет необходимости с технической точки зрения разделять состояние сеанса ASP.NET 2.0 и ASP.NET 4.0, но я, скорее всего, сделаю это ,

(Этот вывод был немного неожиданным, поскольку ASPState сильно изменился с .NET 1.1 на .NET 2.0.)

Подробности для измененной хранимой процедуры каждой версии:

.NET 2.0 ASPState УдалитьExpiredSessions хранимую процедуру:

 CREATE PROCEDURE dbo.DeleteExpiredSessions AS DECLARE @now datetime SET @now = GETUTCDATE() DELETE [ASPState].dbo.ASPStateTempSessions WHERE Expires < @now RETURN 0 GO 

.NET 4.0 ASPState УдалитьExpiredSessions хранимую процедуру:

 CREATE PROCEDURE dbo.DeleteExpiredSessions AS SET NOCOUNT ON SET DEADLOCK_PRIORITY LOW DECLARE @now datetime SET @now = GETUTCDATE() CREATE TABLE #tblExpiredSessions ( SessionID nvarchar(88) NOT NULL PRIMARY KEY ) INSERT #tblExpiredSessions (SessionID) SELECT SessionID FROM [ASPState].dbo.ASPStateTempSessions WITH (READUNCOMMITTED) WHERE Expires < @now IF @@ROWCOUNT <> 0 BEGIN DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT SessionID FROM #tblExpiredSessions DECLARE @SessionID nvarchar(88) OPEN ExpiredSessionCursor FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID WHILE @@FETCH_STATUS = 0 BEGIN DELETE FROM [ASPState].dbo.ASPStateTempSessions WHERE SessionID = @SessionID AND Expires < @now FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID END CLOSE ExpiredSessionCursor DEALLOCATE ExpiredSessionCursor END DROP TABLE #tblExpiredSessions RETURN 0 GO 

Что касается того, почему вышеуказанное изменение было необходимо, я нашел следующее сообщение в блоге MSDN:

  • Тупик при хранении сеансов Asp.net на сервере SQL во время пиковой нагрузки

Выдержка из предыдущей процедуры:


Это приведет к блокировке всех просроченных записей для удаления, и эти блокировки могут быть повышены до блокировок страниц. Это может привести к возникновению взаимоблокировок с другими операциями записи состояния сеанса, когда число записей, отмеченных для удаления, увеличивается. По умолчанию эта хранимая процедура должна запускаться каждую минуту.

Следовательно, более новая версия хранимой процедуры может быть рекомендована и для приложений ASP.NET 2.0.

Еще одна вещь, которую я узнал из сообщения в блоге, которое я не знал: механизм состояния сеанса ASP.NET 4.0 теперь предлагает сжатие . Поиск по сжатиюEnabled в элементе sessionState (схема настроек ASP.NET) .


Наконец, я также нашел кое-что, что имеет отношение к Microsoft, в обозреваемом обозревателе ASP.NET . Выдержка:


Если SQL Server используется для управления состоянием сеанса, все версии ASP.NET (.NET Framework), установленные на одном компьютере, могут совместно использовать сервер состояний SQL, который установлен с последней версией ASP.NET. Схема для состояния сеанса одинакова во всех версиях ASP.NET.

(Хотя есть некоторые отличия в реализации, не относящиеся к схеме.)

  • Режим состояния сеанса asp.net «SQLServer»
  • .Net странная ошибка сессии - переменные исчезают из-за нового сеанса во время обратной передачи
  • SessionState в собственной базе данных SQL Server на общем хостинге Windows
  • Оценки производительности сеанса ASP.NET
  • Как очистить состояние сеанса SQL для всех пользователей в ASP.NET
  • Режим сервера SQL сеанса ASP.NET
  • Производительность сеанса ASP.NET
  • 1 и 1 хостинг и база данных сеансов
  • Давайте будем гением компьютера.