Subsonic, SharedDbConnectionScope и ApplicationState - PullRequest
0 голосов
/ 22 марта 2010

Я смотрю на использование Subsonic с мультитенантным веб-приложением ASP.net. Есть несколько БД (по одному на клиента / экземпляр). Пользователь входит в систему с суффиксом домена к своему имени пользователя (например, user @ tenant1, user @ tenant2).

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

В основном каждый экземпляр будет иметь несколько записей, которые редко изменяются (параметры поиска / конфигурации). Я хотел бы прочитать их в событии Application_Start и кэшировать их в ApplicationState.

В событии Application_Start оно будет зацикливаться на каждой клиентской базе данных, использовать SharedDbConnectionScope для подключения к каждой БД и создавать эти кэшированные записи (например, Application ('tenant1_search_obj') = subsonic_object

Когда пользователь загружает страницу поиска, он затем проверяет, в каком домене находится пользователь, и затем извлекает эту опцию поиска из кэша.

Это возможно? Я просто обеспокоен тем, что если я кеширую объект, когда я извлекаю его из кеша приложения, он не будет знать, какое соединение он использует, и, возможно, получит неверные данные.

Я бы хотел по возможности не помещать это в объект сеанса.

1 Ответ

0 голосов
/ 22 марта 2010

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

Возможно, ваш лучшийСтавка заключается в том, чтобы «лениво загрузить» настройку - первое нажатие на странице поиска загружает конфигурацию в кэш или настройки приложения, и там она остается.

Кроме этого - ответить на ваш вопрос можно.Если вы используете SubSonic 3, просто создайте нового провайдера на лету, используя ProviderFactory.GetProvider (connectionString, "System.Data.SqlClient"), а затем выполните свои действия против него.

Для SubSonic 2 - SharedConnectionScopeэто то, что вы хотите.

...