As explained in the Shared Memory Applications page, eXtremeDB allows two or more processes to share a common database. General instructions are given there explaining how shared memory segments must be created on different operating systems. Further implementation details for C# applications are provided in the following sections.
Example
The following code snippet demonstrates how a process initializes a shared memory device, then uses a
try-catchblocks to and open or connect to a database in shared-memory:public class Open { const int PAGE_SIZE = 128; const int DATABASE_SIZE = 16*1024*1024; // create Database object and define global connection instance public static Database db = new Database(new ExtremedbWrapper()); public static Connection con; public static void OpenSharedDb( String dbName, // name of the database Int32 dbSize, // size of memory segment for in-mem part Int32 pgSize, // size of memory page Int32 maxConnections // max. number of connections ) { Database.Device[] devs = new Database.Device[1]; Database.Parameters parameters = new Database.Parameters(); parameters.MemPageSize = pgSize; parameters.Classes = new Type[] { typeof(Obj) }; // list of database classes parameters.MaxConnections = maxConnections; devs[0] = new Database.SharedMemoryDevice( Database.Device.Kind.Data, dbName + “-db”, new IntPtr(0), dbSize); try { // Open database. If already opened an exception is thrown db.Open("opendb", parameters, devs); } catch (DatabaseError dbe) { // Note that code 66 = “duplicate instance” is a valid case // for a Shared-memory database; the secondary application // will connect to the existing database. So this exception is // ignored and the application continues. Other exceptions are // handled below… if (dbe.errorCode != 66) { if (dbe.errorCode == 62) Console.WriteLine("eXtremeDB assembly is not compatible with option 'shm'. Please replace reference to THE assembly with shared memory functionality"); else if (dbe.errorCode == 620000) Console.WriteLine("eXtremeDB assembly is not compatible with option 'disk'. Please replace reference to assembly with disk manager functionality"); throw dbe; // equivalent to return MCO_E_UNSUPPORTED; } } } public static void ConnectDb() { try { con = new Connection(db); // connect to the database } catch (DatabaseError dbe) { throw dbe; } } public static void Main(String[] args) { try { // This method starts the database runtime and opens a // new database or detects if the shared memory database is // already opened. OpenSharedDb("sharedDb", DATABASE_SIZE, PAGE_SIZE, 1); // Connect to the new or existing shared-memory database ConnectDb(); // Normal database processing goes here con.Disconnect(); db.Close(); } catch (DatabaseError dbe) { Console.WriteLine("\n\nError %d creating/connecting shared memory database.\n", dbe.errorCode); } Console.ReadLine(); } }