共享内存应用程序
Shared Memory Applications in C#
As explained in the Shared Memory Applications page, 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-catch blocks to and open or connect to a database in shared-memory:
public class Open
{
const int PAGE_SIZE = 128;
const int DATABASE_SIZE = 1610241024;
// create Database object and define global connection instance
public static Database db = new Database(new SmartEDBWrapper());
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("SmartEDB assembly is not
compatible with option 'shm'. Please replace
reference to THE assembly with
shared memory functionality");
else if (dbe.errorCode == 620000)
Console.WriteLine("SmartEDB 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();
}
}
Created with the Personal Edition of HelpNDoc: Create help files for the Qt Help Framework