Batch Messaging Example

Let's create a small example to test batch messaging mode behavior. We will use bulk insert with and without batch messaging configuration.

BatchExample.cs: FillUpDb
01private static void FillUpDb(IConfiguration configuration) 02 { 03 IObjectContainer container = Db4oFactory.OpenClient(configuration, Host, Port, User, 04 Password); 05 try 06 { 07 Console.WriteLine("Testing inserts"); 08 DateTime dt1 = DateTime.UtcNow; 09 for (int i = 0; i < NoOfObjects; i++) 10 { 11 Pilot pilot = new Pilot("pilot #" + i, i); 12 container.Set(pilot); 13 } 14 DateTime dt2 = DateTime.UtcNow; 15 TimeSpan diff = dt2 - dt1; 16 Console.WriteLine("Operation time: " + diff.Milliseconds + " ms."); 17 } 18 finally 19 { 20 container.Close(); 21 } 22 }
BatchExample.vb: FillUpDb
01Private Shared Sub FillUpDb(ByVal configuration As IConfiguration) 02 Dim container As IObjectContainer = Db4oFactory.OpenClient(configuration, Host, Port, User, Password) 03 Try 04 Console.WriteLine("Testing inserts") 05 Dim dt1 As DateTime = DateTime.UtcNow 06 Dim i As Integer = 0 07 While i < NoOfObjects 08 Dim pilot As Pilot = New Pilot("pilot #" + i.ToString(), i) 09 container.Set(pilot) 10 System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) 11 End While 12 Dim dt2 As DateTime = DateTime.UtcNow 13 Dim diff As TimeSpan = dt2 - dt1 14 Console.WriteLine("Operation time: " + diff.Milliseconds.ToString() + " ms.") 15 Finally 16 container.Close() 17 End Try 18 End Sub

Let's configure the server and run the insert operation first without batch messages, then with batch messages:

BatchExample.cs: Main
01public static void Main(string[] Args) 02 { 03 IObjectServer db4oServer = Db4oFactory.OpenServer(Db4oFileName, Port); 04 try 05 { 06 db4oServer.GrantAccess(User, Password); 07 IConfiguration configuration = Db4oFactory.NewConfiguration(); 08 FillUpDb(configuration); 09 configuration.ClientServer().BatchMessages(true); 10 FillUpDb(configuration); 11 } 12 finally 13 { 14 db4oServer.Close(); 15 } 16 }
BatchExample.vb: Main
01Public Shared Sub Main(ByVal Args As String()) 02 Dim db4oServer As IObjectServer = Db4oFactory.OpenServer(File, Port) 03 Try 04 db4oServer.GrantAccess(User, Password) 05 Dim configuration As IConfiguration = Db4oFactory.NewConfiguration() 06 FillUpDb(configuration) 07 configuration.ClientServer.BatchMessages(True) 08 FillUpDb(configuration) 09 Finally 10 db4oServer.Close() 11 End Try 12 End Sub

You can try different values of NO_OF_OBJECTS constant to see the difference.

If the value of NO_OF_OBJECTS is high (>1,000,000) you may notice that the memory consumption increases a lot. In order to decrease it, try using:

c#: 

container.Ext().Configure().ClientServer().MaxBatchQueueSize(size);

VB: 

container.Ext().Configure().ClientServer().MaxBatchQueueSize(size);

Specify the size parameter according to the desirable memory consumption limit.