SQL Server 2012 FileTable e Memory-Mapped Files

Abbiamo già parlato di FileTable in questo articolo, dove ci siamo occupati della configurazione di base e del caricamento di alcuni file musicali. Questo grazie alla possibilità di accedere tramite applicazioni Win32, in quel caso Windows Media Player, ad una condivisione di rete messa a disposizione per l’accesso non transazionale.

Alcune applicazioni utilizzano una modalità particolare di gestione dei file in memoria, chiamata Memory-Mapped, che non viene gestita correttamente nel caso in cui il file sia presente all’interno di una FileTable e l’applicazione che accede al file si trovi sullo stesso server.

memorymapped

Figura1

Se invece l’applicazione accede alla FileTable da remoto, sfruttando la share SMB, il problema non si verifica perché in quel caso i file vengono caricati in memoria in maniera differente.

Alcuni esempi di applicazioni che usano i Memory-Mapped Files, e che potete usare per riprodurre con semplicità questo comportamento, sono Notepad e Paint. In figura 2 e figura 3, ad esempio, potete vedere gli errori di Paint e Notepad all’apertura di un file all’interno di una FileTable.

1

Figura2

2

Figura3

Se uso Notepad, figura 4, per aprire lo stesso file da remoto il file viene aperto correttamente.

4

Figura4

Se volete invece scrivere una vostra applicazione di test che sfrutta questa caratteristica potete farlo per esempio utilizzando il .NET Framework, in particolare utilizzando la classe MemoryMappedFile all’interno del Namespace System.IO.MemoryMappedFiles. Di seguito il codice di esempio che usa il metodo CreateFromFile e uno screenshot che dimostra l’errore accedendo ad un file all’interno di una FileTable dalla stesso computer.

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.IO;
 using System.IO.MemoryMappedFiles;
 using System.Runtime.InteropServices;
  
 namespace franced.sql.dev.test
 {
     class Program
     {
         static void Main(string[] args)
         {
             
             using (var myMMFile = MemoryMappedFile.CreateFromFile(@"C:\Temp\DOCUMENT.txt", FileMode.Open))
             {
                 Console.WriteLine("OK!");
             };
             
         }
     }
 }

3

Figura5

Ovviamente, come per notepad, il problema non si presenta se eseguiamo la stessa operazione da remoto.

Riferimenti :

https://msdn.microsoft.com/en-us/library/dd997372.aspx

https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx

Francesco