iBoxDB

Fast ACID Table-Style Document NoSQL Database

fast lightweight ACID embedded table style document NoSQL database for java c# android unity xamarin mono blazor .net core linux windows. Application NoSQL Database small footprint makes it easier and cheaper to store and process data. Thread-Safe best lightweight general purpose Java .NET Local ACID database. NoSQL Embedded Document Database Engine Java C# Mono Android iPhone ASP.NET Core. lightweight serverless database best NoSQL database embedded for java .net c# android stable standalone DB. Local Database Lightweight self-contained database Cross Platform for Linux and Mac and Win. In Memory and On Disk Mobile Database, Java C# Local Serverless NoSQL Storage, with SQL Document Table. embedded database server cross-platform development. support Blazor to store data on server or client. and can post database from client to server when online.

Description

iBoxDB is a fast acid table-style document NoSQL Embedded Database, easily store objects and documents, traditional table with unstructured data, zero configuration, pure JAVA and DotNET engines, no dependencies.

iBoxDB has a well designed interface with great performance and capability for agile development. You can create applications with database services embedded and deploy it on mobiles, desktops, servers, to locally persist your data from anywhere.

Green, low carbon emission!

Dual Core Application Database
For   JAVA   C#   Android   Unity   Xamarin   Mono   Linux   Windows

Features

Examples,   CSharp   and   Java

Each box is an ISOLATED data space (transaction-based)

  using(var box = auto.Cube())
  {                            
     //select, insert, update, delete ...
     CommitResult cr = box.Commit();
  }

  try(Box box = auto.cube()){
     ...
     CommitResult cr = box.commit();
  }  

Normal Object
  Member m = new Member();  
  m.Id = box.NewId();
  m.Name = "Andy";
  m.Password = EncodePassowrd("123");
  box["Member"].Insert(m);

  Member m = new Member();
  m.Id = box.newId();
  m.Name = "Kevin";
  box.d("Member").insert(m); 

Dynamic Object (document database)
  //Game : Dictionary<string, object>
  game["GameType"] = "ACT";
  box["Product"].Insert(game);

  //Game extends HashMap<String,Object>
  game.put("GameType", "ACT");
  box.d("Product").insert(game);  

Key Value Style Query
  box["Table", 2L].Select<Member>();
   //Composite Key
  box["Table2", 99, "ABC"].Select<Product>();

  box.d("Table", 3L).select(Member.class);
  //Composite Key
  box.d("Table2", 88, "ABC").select(Product.class);  

Composite Key Supported
  config.ensureTable(Item.class, "Item", "UID", "Type")
Database Composite Key
SQL Like
  /* 
  from TABLE where A>? & B<=? order by C limit 0,10

  from [table] where [condition] 
                      order by [field1] desc,[field2] limit [0,10]
  [Condition:] == != < <= > >= & | ( )
  */   
  box.Select<Member>("from Member where Name==?", "MyName");
  box.select(Member.class, "from Member where Name==?", "MyName"); 

Query
  //query
  box.Select("from Member");
  //load to memory first, startswith '*'
  box.Select("*from Member");
  //selecting tracer, startswith '!'
  box.Select("!from Member");  

Weak Object
  //Strongly typed
  box.select("from Table where Id > ?" , 1L);
  //Weak Object
  box.select("from Table where Id > ?" , new Variant("1")); 

Index, make Select hundred times faster in average
  config.EnsureIndex<Member>("Member", "Field1","Field2")
  config.ensureIndex(Member.class, "Member", isUnique,"Field1","Field2")
  box.Select("from Member where Field1 == ? & Field2 == ?",arg1,arg2)

  //Id on the Left would faster in many cases
  box.Select("from Member where Id == ? & Field == ?",id,arg)

  //combining Results would faster than OR,
  //depends on the scale of dataset and corresponded Index configure.	
  //where Id == ? | Id == ? | Id == ?
  foreach(var id in [ 1, 2, 3 ])
    combiner.Add( box.Select("from Member where Id == ?",id) )

Custom QueryFunction
  box.Select<Member>("from Member where [Tags]", new IFunction("Value"))

Compatible with LINQ (.NET)
  from o in box.Select<Member>("from Member")
  where o.Text.Contains(text) select o;

Compatible with Stream (Java)
  StreamSupport
   .stream(box.select(Member.class,"from Member").spliterator(), true)
   .collect(groupingBy(m -> m.group, summarizingLong(m -> m.value)))

Ason and Prototype Columns
  //define prototype, Id is Long		
  Ason prototype = new Ason("Id:", 0L, "Name:", "Guest");

  Ason record = prototype.select();
  //set Id as String,
  record.set("Id", "123");
  //will automatically convert to Long as the prototype
  System.out.println("Output: " + record.get("Id").getClass());
  //Output: class java.lang.Long

Mirror Copy
  auto.GetDatabase().CopyTo(new Mirror(bakAddr, bakRoot), buffer) 

Directly Select
  //Select records from a samll file directly
  //without initializing database                   
  IEnumerable records = DB.Select(fileAddress) 

Transaction Huggers
  //Three transactions committed together
  long huggersBuffer = 1024L * 1024L * 32L;                   
  box1.Commit(huggersBuffer);
  box2.Commit(huggersBuffer);
  box3.Commit(); 

Replication
  //Master-Master
  BoxData.masterReplicate();  
  //Master-Slave
  BoxData.slaveReplicate();

Snapshot-Serializable Transaction
Transaction Step Isolation Level
Application Point Snapshot
Database Point Serializable
using(var box = auto.Cube()){
  //Snapshot...
  box.Commit( ()=>{
    //Serializable...  
  }); 
}

Update Increment
Update Increment Auto Increment
Apply To index key
Trigger insert / update insert
Type long number
Value From database newId (MaxPos,1) table max (ID)+1
Generator Time serializable transaction commit data insert, differed from commit order

Selecting Tracer
Tracer Locker
Thread non-blocked blocked
Usage read / write different records read / write same record

IO
IO
 BoxFileStreamConfig
 BoxMemoryStreamConfig
 ReadonlyStreamConfig
 CacheStreamConfig 

Database Path
C# & JAVA,  place outside IDE working directory can get better performance
//different path has hugely different writing speed on VM.
IBoxDB.LocalServer.DB.Root("/data/") 

ASP.NET Cross Platform
DB.Root(MapPath("~/App_Data/"))

Xamarin
DB.Root(System.Environment.GetFolderPath( 
       System.Environment.SpecialFolder.LocalApplicationData/Personal))

Unity3D
DB.Root(Application.persistentDataPath)

Android
DB.root(android.os.Environment.getDataDirectory()
       .getAbsolutePath() + "/data/" + packageName + "/") 

JSP WebApplication
@WebListener()
public class StartListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
       String path = System.getProperty("user.home") + "/data/"; 
       new File(path).mkdirs();   
       DB.root(path); 
    }
} 

Getting Started
 using IBoxDB.LocalServer;

 var db = new DB();
 db.GetConfig().EnsureTable<Record>("Table", "Id");
 AutoBox auto = db.Open();

 auto.Insert("Table", new Record { Id = 1L, Name = "Andy" });
 var record = auto.Get<Record>("Table", 1L);
 record.Name = "Kelly";
 auto.Update("Table", record);
 auto.Delete("Table", 1L);  

 import iboxdb.localserver.*;

 DB db = new DB();
 db.getConfig().ensureTable(Record.class, "Table", "Id");
 AutoBox auto = db.open();

 auto.insert("Table", new Record(1L, "Andy"));
 Record record = auto.get(Record.class, "Table", 1L);
 record.Name = "Kelly";
 auto.update("Table", record);
 auto.delete("Table", 1L);  

Install
.NET: Add NETDB/iBoxDB.DLL  to Project
Java: Add JavaDB/iboxdb.jar to Project

Benchmark with MySQL
iBoxDB
 Insert: 1,000,000 AVG: 47,016 objects/s 
 Update: 1,000,000 AVG: 25,558 objects/s 
 Delete: 1,000,000 AVG: 42,714 objects/s 

MySQL
 Insert: 1,000,000 AVG: 5,514 objects/s 
 Update: 1,000,000 AVG: 5,109 objects/s 
 Delete: 1,000,000 AVG: 6,044 objects/s 

Supported Types
.NET JAVA
 bool
 char
 byte
 sbyte
 short 
 ushort
 int
 uint
 long
 ulong
 float
 double
 decimal
 DateTime
 Guid
         
 bool? 
 char? 
 byte? 
 sbyte? 
 short?
 ushort? 
 int? 
 uint? 
 long? 
 ulong?
 float? 
 double? 
 decimal?
 DateTime?
 Guid? 
 string 
       
 //non indexable
 Dictionary
 <string, object>
 MemoryStream
 byte[]
 string[]
  
 boolean 
 Boolean
 byte 
 Byte
 char 
 Character
 short 
 Short
 int 
 Integer
 long 
 Long
 float
 Float
 double
 Double
 UUID
 Date

 //dynamic length
 BigDecimal
 BigInteger
 String
 
 //non indexable
 HashMap
 <String, Object>
 MemoryStream
 byte[]
 Object[]










Automatic Object Mapping
//Name
*.Name

//name
*.name




//Name
*.Name
*.Name(val)
*.setName(val)

//name
*.name
*.name(val)
*.setname(val)

Cross Platform
NoSQL Application Database for JAVA, .NET, Android, Mono, Unity3D, Xamarin, Linux, Windows

NEXT - >
iBoxDB professional document database ACID NoSQL application database c# java .net core xamarin unity3d android embedded document database powerful cross platform NoSQL databases system. Application NoSQL database small footprint makes it easier and cheaper to store and process data. NoSQL embedded document database engines for java .net core c# mono android. cross-platform development. Just Enough to Get the Job Done.
Update 7-5-2021.