Skip to content

Embedded NoSQL Database for java c# unity android xamarin... WebSite Mirror

Notifications You must be signed in to change notification settings

iboxdb/iboxdb.github.io

Repository files navigation

iBoxDB

Fast ACID Table-Style Document NoSQL Database

Project 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...

Download Assemblies

Download Mirror

Website Mirror https://iboxdb.github.io/

Features

  • CRUD and Forward CRUD
  • KeyValue and KeyOnly tables
  • Unique and non-unique indexes
  • Unique and non-unique composite indexes
  • SQL like query language
  • Transactions support
  • Concurrency control, thread safe
  • Multiple applications supported
  • Memory management
  • Scalable hot MasterMaster and MasterSlave replications
  • Hot mirror copy
  • On disk and in memory databases supported
  • Automatically create databases
  • Zero configuration, copy and run, purely managed code
  • Dynamic columns
  • Prototype columns
  • Different types with different indexes can be stored in same table
  • Persistence + ORM + Cache + Embeddable, ONE STOP solution
  • Ason, Array Script Object Notation
  • High performance, no dependencies
  • Transaction Huggers
  • Directly Select
  • Update Increment
  • Selecting Tracer
  • Snapshot-Serializable Isolation
  • JAVA6+    .NET2+

Examples

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);  

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")  

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) )

Composite Key Supported

config.ensureTable(Item.class, "Item", "UID", "Type")

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 & 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(); 

Weak Object

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

Forward CRUD

try (Box box = auto.cube()) { 
   // forward Update()
   Member m = box.d("Table", 100L).update(Member.class); 
   m.setName("Name"); 
   m.setAmount(BigDecimal.TEN); 
   CommitResult cr = box.commit(); 
}

Snapshot-Serializable Transaction

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

Update Increment

  Apply To Trigger Type
UpdateIncrement non-primary key insert/update long
AutoIncrement primary key insert number
  Value From Generator Time
UpdateIncrement Database NewId(MaxPos,1) Serializable Transaction Commit
AutoIncrement Table Max(ID)+1 Data Insert, Differed from Commit order

Selecting Tracer

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

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 C# and Java

 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);  

Schemata

auto.getDatabase().getSchemata() 

Automatic Object Mapping

Method Column
*.Name Name
*.name name
Java Column
*.Name(val) Name
*.setName(val) Name
*.name(val) name
*.setname(val) name

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 

Benchmark Code

Version 3.0 With MySQL Java Maven

Version 3.0 With SQLite C#

Version 2.X With MySQL Java Maven

Version 2.X With SQLite C#

Cross-Platform

Links

Full Text Search Java

Full Text Search C#

Blazor Wasm Client

Gradle Demo jMonkeyEngine

Nuget Package

.NET Linq, integrating with SQL ORM -XPO


More

More Examples

About

Embedded NoSQL Database for java c# unity android xamarin... WebSite Mirror

Topics

Resources

Stars

Watchers

Forks