1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>Reverse BTree Splits</title> 7 <link rel="stylesheet" href="gettingStarted.css" type="text/css" /> 8 <meta name="generator" content="DocBook XSL Stylesheets V1.62.4" /> 9 <link rel="home" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" /> 10 <link rel="up" href="txnconcurrency.html" title="Chapter 4. Concurrency" /> 11 <link rel="previous" href="txnnowait.html" title="No Wait on Blocks" /> 12 <link rel="next" href="filemanagement.html" title="Chapter 5. Managing DB Files" /> 13 </head> 14 <body> 15 <div class="navheader"> 16 <table width="100%" summary="Navigation header"> 17 <tr> 18 <th colspan="3" align="center">Reverse BTree Splits</th> 19 </tr> 20 <tr> 21 <td width="20%" align="left"><a accesskey="p" href="txnnowait.html">Prev</a> </td> 22 <th width="60%" align="center">Chapter 4. Concurrency</th> 23 <td width="20%" align="right"> <a accesskey="n" href="filemanagement.html">Next</a></td> 24 </tr> 25 </table> 26 <hr /> 27 </div> 28 <div class="sect1" lang="en" xml:lang="en"> 29 <div class="titlepage"> 30 <div> 31 <div> 32 <h2 class="title" style="clear: both"><a id="reversesplit"></a>Reverse BTree Splits</h2> 33 </div> 34 </div> 35 <div></div> 36 </div> 37 <p> 38 If your application is using the Btree access method, and your 39 application is repeatedly deleting then adding records to your 40 database, then you might be able to reduce lock contention by 41 turning off reverse Btree splits. 42 </p> 43 <p> 44 As pages are emptied in a database, DB attempts to 45 delete empty pages in order to keep 46 the database as small as possible and minimize search time. 47 Moreover, when a page in the database fills 48 up, DB, of course, adds additional pages 49 to make room for more data. 50 </p> 51 <p> 52 Adding and deleting pages in the database requires that the 53 writing thread lock the parent page. Consequently, as the 54 number of pages in your database diminishes, your application 55 will see increasingly more lock contention; the maximum level 56 of concurrency in a database of two pages is far smaller than 57 that in a database of 100 pages, because there are fewer pages 58 that can be locked. 59 </p> 60 <p> 61 Therefore, if you prevent the database from being reduced to a 62 minimum number of pages, you can improve your application's 63 concurrency throughput. Note, however, that you should do so 64 only if your application tends to delete and then add the same 65 data. If this is not the case, then preventing reverse Btree 66 splits can harm your database search time. 67 </p> 68 <p> 69 To turn off reverse Btree splits, 70 71 <span> 72 set 73 <tt class="methodname">DatabaseConfig.setReverseSplitOff()</tt>. 74 to <tt class="literal">true</tt>. 75 </span> 76 </p> 77 <p> 78 For example: 79 </p> 80 <pre class="programlisting">package db.txn; 81 82import com.sleepycat.db.Database; 83import com.sleepycat.db.DatabaseType; 84import com.sleepycat.db.DatabaseConfig; 85import com.sleepycat.db.DatabaseException; 86import com.sleepycat.db.Environment; 87import com.sleepycat.db.EnvironmentConfig; 88 89import java.io.File; 90import java.io.FileNotFoundException; 91 92... 93 94Database myDatabase = null; 95Environment myEnv = null; 96try { 97 EnvironmentConfig myEnvConfig = new EnvironmentConfig(); 98 myEnvConfig.setInitializeCache(true); 99 myEnvConfig.setInitializeLocking(true); 100 myEnvConfig.setInitializeLogging(true); 101 myEnvConfig.setTransactional(true); 102 103 myEnv = new Environment(new File("/my/env/home"), 104 myEnvConfig); 105 106 // Open the database. 107 DatabaseConfig dbConfig = new DatabaseConfig(); 108 dbConfig.setTransactional(true); 109 dbConfig.setType(DatabaseType.BTREE); 110 111 // Set BTree reverse split to off 112 dbConfig.setReverseSplitOff(true); 113 114 myDatabase = myEnv.openDatabase(null, // txn handle 115 "sampleDatabase", // db file name 116 "null", // db name 117 dbConfig); 118} catch (DatabaseException de) { 119 // Exception handling goes here 120} catch (FileNotFoundException fnfe) { 121 // Exception handling goes here 122}</pre> 123 <p> 124 Or, if you are using the DPL: 125</p> 126 <pre class="programlisting">package db.txn; 127 128import com.sleepycat.db.Database; 129import com.sleepycat.db.DatabaseType; 130import com.sleepycat.db.DatabaseConfig; 131import com.sleepycat.db.DatabaseException; 132import com.sleepycat.db.Environment; 133import com.sleepycat.db.EnvironmentConfig; 134 135import java.io.File; 136import java.io.FileNotFoundException; 137 138... 139 140EntityStore myStore = null; 141Environment myEnv = null; 142try { 143 EnvironmentConfig myEnvConfig = new EnvironmentConfig(); 144 myEnvConfig.setInitializeCache(true); 145 myEnvConfig.setInitializeLocking(true); 146 myEnvConfig.setInitializeLogging(true); 147 myEnvConfig.setTransactional(true); 148 149 myEnv = new Environment(new File("/my/env/home"), 150 myEnvConfig); 151 152 // Configure the store. 153 StoreConfig myStoreConfig = new StoreConfig(); 154 myStoreConfig.setAllowCreate(true); 155 myStoreConfig.setTransactional(true); 156 157 // Configure the underlying database. 158 DatabaseConfig dbConfig = new DatabaseConfig(); 159 dbConfig.setTransactional(true); 160 dbConfig.setAllowCreate(true); 161 dbConfig.setType(DatabaseType.BTREE); 162 163 // Set BTree reverse split to off 164 dbConfig.setReverseSplitOff(true); 165 166 // Instantiate the store 167 myStore = new EntityStore(myEnv, "store_name", myStoreConfig); 168 169 // Set the DatabaseConfig object, so that the underlying 170 // database is configured for uncommitted reads. 171 myStore.setPrimaryConfig(SomeEntityClass.class, dbConfig); 172 173} catch (DatabaseException de) { 174 // Exception handling goes here 175} catch (FileNotFoundException fnfe) { 176 // Exception handling goes here 177}</pre> 178 </div> 179 <div class="navfooter"> 180 <hr /> 181 <table width="100%" summary="Navigation footer"> 182 <tr> 183 <td width="40%" align="left"><a accesskey="p" href="txnnowait.html">Prev</a> </td> 184 <td width="20%" align="center"> 185 <a accesskey="u" href="txnconcurrency.html">Up</a> 186 </td> 187 <td width="40%" align="right"> <a accesskey="n" href="filemanagement.html">Next</a></td> 188 </tr> 189 <tr> 190 <td width="40%" align="left" valign="top">No Wait on Blocks </td> 191 <td width="20%" align="center"> 192 <a accesskey="h" href="index.html">Home</a> 193 </td> 194 <td width="40%" align="right" valign="top"> Chapter 5. Managing DB Files</td> 195 </tr> 196 </table> 197 </div> 198 </body> 199</html> 200