Java
1.7 and UP.
It uses NIO File channels for cache write backs to disk. Hence dependency on 1.7.
Github location
https://github.com/dreamdbvilas/wonderdb
Design and How it works
WonderDB cache can be configured as Btree+ index or hash index. Please refer to my blog on Btree+ and Hash Index to understand how both these data structures work in general and how they are used in WonderDB.
Downloading Server and Client
Download bundled server jar file from maven repo
1. Go to maven central on your browser; http://search.maven.org 2. Search for "wonderdb" in search box; You will see 0.3 Latest version under artifact "wondered" 3.Download "wonderdb.jar" from download column.
Download server.properties
1. Go to github; https://github.com/dreamdbvilas/wonderdb 2. Get server.properties file. You will see it on the same page. Click on it and copy it to desired folder.
Download bundled client jar file from maven repo
1. Go to maven central on your browser; http://search.maven.org 2. Search for "wonderdb" in search box. You will see 0.1 latest version of "wonderdbcommandline". 3. Download wondered.jar from Download column
Starting server
Once you have both, the bundled jar and server.properties, you can start the server using following command.
java -cp <jar file name you downloaded in above step> org.wonderdb.WonderDBServer server.properties
Starting client
It needs 2 params machine and port. Default port is 6060. You can change it in server.properties for server if you need to.
java -cp <downloaded bundled client jar> org.wonderdb.wonderdbcommandline.SimpleClient localhost 6060
Simple Client Server interactions through server
You can give following commands through client.
Simple SQL commands to try with
create table vilas (id int, name string, salary long); create table company (id int, name string, department string); create unique index vilasPK on vilas(id); insert into vilas (id, name, salary) values (1, 'vilas', 100); insert into vilas (id, name) values (2, 'wondered'); select * from vilas; select * from vilas where id = 1; select * from vilas where id >= 0; select * from vilas where id >= 0 and id < 100; select * from vilas where id > 1; explain plan select * from vilas; explain plan select * from vilas where id = 10; explain plan select * from vilas where id > 10; explain plan select * from vilas where salary >= 100; update vilas set salary = 200 where id = 1; delete vilas where id = 3; delete vilas where id = 2; shutdown
Configuration
Default server.properties contents are configured for dev machines with minimum settings for caches. You will need to change values based on available physical memory.
Property | Description |
---|---|
primaryCache.maxSize | Default value 50000. It means it uses 50000 blocks of JVM memory for caching. Each block is 2048 bytes. So default value will use 50000*2048=100MB of JVM heap. Rule of thumb is to set 50% of JVM heap for primary cache. |
primaryCache.highWatermark | Default value 49090. It describes when primary cache eviction thread will start evicting entries into the cache. Its value should be about 1% of primaryCache.maxSize. |
primaryCache.lowWatermark | Default value 49050. It describes when primary cache eviction thread stops evicting. Its value should be 2% of primary cache max size. |
secondaryCache.maxSize | Default value 50000. It uses 50000 blocks of machine physical memory (Direct ByteBuffer). Each block is 2048 bytes. So default value will use 50000*2048=100MB of machine physical memory outside of JVM heap. Set its value based on available machine physical memory. |
secondaryCache.highWatermark | Default value 49050. It describes when secondary cache eviction thread will start evicting entries into the cache. Its value should be about 1% of secondaryCache.maxSize. |
secondaryCache.lowWatermark | Default value 49050. It describes when secondary cache eviction thread stops evicting. Its value should be about 2% of secondary cache max size. |
cacheWriter.syncTime | Default value 3000 (3 seconds). Its value is set in millisecond. It describes how frequently cache writer thread writes back dirty blocks from secondary cache to the disk. |
disk.asyncWriterThreadPool.queueSize | Default value 10. It describes number parallel threads cache writer invokes to write secondary cache block to disk. Its value should be set depending on type of disk and number of CPUs the node has. |
cache.storage | Default value ./cache. It describes location of disk file to store cache entries. |
cacheIndex.storage | Default value ./cacheIndex. It describes location of disk file to store cache key entries. |
cache.type | [btree , hash]. Default is btree. Read more about btree. If your queries are mostly PK lookup type then use hash else leave it to btree. We have seen performance improvement of over 100% with hash. |
cache.buckets | This is used only when cache.type is hash. I am in the process of updating a document explaining calculations for its optimal performance. For now leave it to its default value. |
Using it in the code
Downloading JDBC driver
Add following maven POM dependency in your java project.
<dependency> <groupId>org.wonderdb</groupId> <artifactId>wonderdbjdbcdriver</artifactId> <version>0.2</version> </dependency>
JDBC URL
wonderdb://<machine name>:<port>
Code
public static void main(String[] args) { DBDriverManager.registerDriver(new WonderDBDriver()); Connection connection = DriverManger.getConnection("wondered://localhost:6060"); PreparedStatement stmt = connection.prepareStatement("select * from vilas"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); long salary = rs.getLong(3); } // DML statements; insert, update, delete stmt = connection.prepareStatement("insert into vilas (id, name) values (10, 'jdbc')"); int count = stmt.executeQuery(); connection.close(); }
Shutdown
You can shutdown server through SimpleClient. In SimpleClient prompt just call shutdown
shutdown
Questions?
Post you question on WonderDBCache google group.
Leave a Reply