분산 캐싱은 데이터베이스가 확장성 병목 현상이 되지 않도록 하기 위해 트랜잭션이 많은 애플리케이션에서 매우 중요한 부분이 되었습니다. 그러나 분산 캐시는 애플리케이션 데이터의 복사본을 보관하므로 항상 데이터베이스와 동기화 상태를 유지해야 합니다. 이것이 없으면 분산 캐시에 데이터 무결성 문제를 일으키는 오래된 부실 데이터가 있습니다. SQL Server는 이벤트 알림 메커니즘을 제공합니다. 분산 캐시 처럼 NCache 통해 변경 알림에 등록할 수 있습니다. SqlCacheDependency 그런 다음 데이터베이스에서 기본 데이터가 변경될 때 SQL Server로부터 알림을 받습니다. 이를 통해 NCache 해당 캐시 항목을 즉시 무효화하거나 다시 로드하면 캐시가 항상 데이터베이스와 동기화됩니다. 하지만, SqlCacheDependency 캐시를 데이터베이스와 동기화하는 매우 리소스 집약적인 방법이 될 수 있습니다. 먼저 별도의 창을 만들어야 합니다. SqlCacheDependency 캐시된 각 항목에 대해 수십만은 아니더라도 수만까지 쉽게 갈 수 있습니다. 그리고 SQL Server는 데이터 구조를 사용하여 각 SqlCachDependency를 별도로 유지 관리하므로 이와 관련된 모든 데이터 변경 사항을 모니터링할 수 있습니다. 그리고 이것은 많은 추가 리소스를 소비하고 쉽게 데이터베이스 서버를 질식시킬 수 있습니다.
둘째, SQL Server는 각 데이터 변경에 대해 별도의 .NET 이벤트를 발생시키고 NCache 이러한 이벤트를 포착합니다. 그리고 이러한 .NET 이벤트는 매우 무거울 수 있으며 네트워크 트래픽과 전체 성능을 쉽게 압도할 수 있습니다. NCache 그리고 당신의 지원서. 더 나은 대안이 있습니다. 이것은 당신이 CLR 저장 프로시저 와 연결되는 NCache SQL Server 내에서 해당 캐시 항목을 직접 업데이트하거나 무효화합니다. 그런 다음 테이블의 업데이트 또는 삭제 트리거에서 이 CLR 저장 프로시저를 호출할 수 있습니다. SQL Server 2005 또는 2008과 Oracle 10g 이상에서 이 작업을 수행할 수 있지만 Windows에서 실행 중인 경우에만 가능합니다. CLR 저장 프로시저는 관련 데이터 구조를 생성하지 않기 때문에 리소스 효율성이 더 높습니다. SqlCacheDependency. 또한 .NET 이벤트를 실행하지 않습니다. NCache. 대신, 그것은 NCache 클라이언트 연결 및 직접 알려줍니다 NCache 캐시된 항목을 무효화할지 다시 로드할지 여부. 그리고, 이 연결은 NCache 고도로 최적화되었으며 .NET 이벤트보다 훨씬 빠르고 가볍습니다.
다음은 CLR 저장 프로시저를 사용하는 방법의 예입니다.
- 부 log4net 와 프로토부프넷 Windows GAC에서 NCache/bin/assembly/2.0 폴더(대상 플랫폼이 .NET 4.0인 경우 4.0 선택).
2. 회원가입 NCache SQL 서버의 다음 어셈블리. 아래에 예가 나와 있습니다. 이 예에서는 Northwind를 샘플 데이터베이스로 사용하고 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
use Northwind alter database Northwind set trustworthy on; go drop assembly SMdiagnostics drop assembly [System.Web] drop assembly [System.Messaging] drop assembly [System.ServiceModel] drop assembly [System.Management] CREATE ASSEMBLY SMdiagnostics AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv3.0Windows Communication FoundationSMdiagnostics.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.Web.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.management.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv2.0.50727System.Messaging.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.ServiceModel.dll' WITH permission_set = unsafe CREATE ASSEMBLY NCache FROM N'C:Program FilesNCachebinassembly2.0Alachisoft.NCache.Web.dll' WITH permission_set = unsafe |
3. Visual Studio를 열어 저장 프로시저 작성 NCache 그리고 아래와 같이 SQL CLR 데이터베이스 프로젝트를 생성합니다. 에 대한 참조를 추가합니다. NCache 마지막 단계에서 생성한 어셈블리. 참조해야 하는 어셈블리는 위에 강조 표시되어 있습니다. "와 같은 이름으로 SQL Server 아래에 나타납니다.NCache".
4. 스토어드 프로시저를 작성하십시오. 다음은 주어진 샘플 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void TestSProc(string cacheName) { //--- Put your code here SqlPipe sp = SqlContext.Pipe; try { sp.Send("Starting ....."); if (string.IsNullOrEmpty(cacheName)) cacheName = "mycache"; Cache _cache = NCache.InitializeCache(cacheName); _cache.Insert("key", DateTime.Now.ToString()); sp.Send("Test is completed ..."); } |
5. 아래와 같이 데이터베이스에서 CLR 통합을 활성화합니다.
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. Visual Studio에서 저장 프로시저를 배포하고 테스트합니다.
7. 저장 프로시저를 배포한 후 저장 프로시저 어셈블리를 (C:Program Files에 배치해야 합니다.NCachebinassembly2.0) 폴더는 Windows GAC 폴더에서 직접 어셈블리 참조를 확인하지 않고 로컬에서 필요하기 때문입니다.
CLR 기반 저장 프로시저 또는 트리거는 응용 프로그램 성능을 크게 향상시킬 수 있습니다. SqlCacheDependency 이는 상대적으로 느리고 대규모 데이터 세트의 경우 압도적일 수 있습니다.
SQLCacheDependency 자체에는 문제가 없습니다. 응용 프로그램이 데이터베이스에 대한 변경 사항을 커밋하는 경우 가장 좋은 방법은 종속성을 처리하고 결과적으로 데이터베이스에 커밋하는 분산 캐시를 중간에 추가하는 것입니다. 두 가지 시나리오에서만 대체 솔루션을 찾습니다.
하나는 다른 애플리케이션이 데이터베이스를 변경하고 있는데 사용자가 이를 제어할 수 없거나 캐시를 사용하여 DB 커밋을 수행하도록 지시할 수 없는 경우입니다.
두 번째 이유는 각 테이블에 대해 많은 종속성을 갖고 싶거나 DB 쓰기/업데이트 환경이 높은 경우 폴링 종속성을 사용할 수 있습니다. 데이터베이스를 폴링하여 변경 사항을 감지하고 캐시의 항목을 무효화합니다.
자세한 내용은 다음 문서를 참조하십시오. https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
안녕 이크발,
이 기사를 따르려고 하는데 SQL 스크립트를 실행할 때 다음 오류가 발생합니다.
메시지 6544, 수준 16, 상태 1, 선 26
'microsoft.visualbasic.activities.compiler' 어셈블리의 형식이 잘못되었거나 순수 .NET 어셈블리가 아니기 때문에 'System.ServiceModel' 어셈블리에 대한 CREATE ASSEMBLY가 실패했습니다.
SQLCLR 프로시저 내부에서 WCF를 사용하는 것이 더 이상 지원되지 않는 경우 성능 문제를 피하면서 권장되는 캐시 동기화 방법은 무엇입니까? SqlCacheDependency.
고마워, 라이언.
이 게시물은 업데이트되었습니다. 이제 모든 단계가 NCache 4.1
안녕 세르게이,
귀하의 환경에서 이 문제를 해결할 수 있는 수정 프로그램을 다운로드하십시오. 이 구현은 NCache 4.1 버전이며 아래 수정 사항을 적용해야만 호환됩니다.
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
패치 내 “Readme.txt” 파일을 참고하여 자신의 환경에 적용하시기 바랍니다.
현재 이 수정 사항은 캐시 서버 설치용으로 제공되며 .Net 2.0 어셈블리만 포함합니다. 사용자 환경에서 이를 테스트하고 확인할 수 있으며 .NET 전용 전체 패치를 제공할 수 있습니다. NCache 주문형 설치.
또한 저장 프로시저를 배포한 후 저장 프로시저 어셈블리를 (C:Program Files)에 배치해야 합니다.NCachebinassembly2.0) 폴더는 Windows GAC 폴더에서 직접 어셈블리 참조를 확인하지 않고 로컬에서 필요하기 때문입니다.
어떻게 되는지 알려주세요
안녕 이크발,
단락 5와 동일한 코드로 설명한 대로 CLR 저장 프로시저를 만들었습니다. exec를 시도하면 다음 예외가 발생합니다.
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException: client.ncconf를 읽는 동안 오류가 발생했습니다.
그게 보인다 NCache 구성 파일을 찾을 수 없지만 파일이 설치 디렉터리 C:Program Files에 있습니다.NCache설정
도와주세요.
감사
세르게이